2013-06-18 10 views
5

Ho una funzione protetta che è definita all'interno di una determinata classe. Voglio essere in grado di chiamare questa funzione protetta al di fuori della classe all'interno di un'altra funzione. Questo è possibile e se sì, come posso raggiungerloCan I/How to ... chiama una funzione protetta al di fuori di una classe in PHP

class cExample{ 

    protected function funExample(){ 
    //functional code goes here 

    return $someVar 
    }//end of function 

}//end of class 


function outsideFunction(){ 

//Calls funExample(); 

} 
+2

Non è possibile. Ciò vanificherebbe lo scopo di avere una funzione protetta in primo luogo.Potresti avere un metodo pubblico che invoca il metodo protetto per tuo conto, ma allora perché iniziare con un metodo protetto? –

+0

Un duplicato di http://stackoverflow.com/q/12255740/2088851 – Voitcus

risposta

8

Questo è il punto di OOP - incapsulamento:

privato

Only can be used inside the class. Not inherited by child classes. 

Protetta

Only can be used inside the class and child classes. Inherited by child classes. 

pubblica

Can be used anywhere. Inherited by child classes. 

Se si vuole ancora di attivare tale funzione al di fuori, è possibile dichiarare un metodo pubblico che innesca il metodo protetto:

protected function b(){ 

} 

public function a(){ 
    $this->b() ; 
    //etc 
} 
2

È possibile sostituire questa classe con un altro in cui si effettua questo pubblico.

class cExample2 extends cExample { 
    public function funExample(){ 
    return parent::funExample() 
    } 
} 

(notare che questo non funziona con soci privati)

Ma l'idea dei membri privati ​​e protetti è quello di non essere chiamate dall'esterno.

1

Se si desidera condividere il codice tra le classi, è possibile utilizzare i tratti, ma dipende da come si desidera utilizzare la funzione/metodo.

Comunque

trait cTrait{ 
    public function myFunction() { 
     $this->funExample(); 
    } 
} 

class cExample{ 
    use cTrait; 

    protected function funExample() { 
    //functional code goes here 

    return $someVar 
    }//end of function 

}//end of class 

$object = new cExample(); 
$object->myFunction(); 

questo funzionerà, ma tenere a mente che non si sa che cosa la classe è fatto in questo modo. Se cambi la caratteristica allora anche tutte le tue classi che la usano verranno alterate. È anche buona pratica scrivere un'interfaccia per ogni tratto che usi.

1

qui posso darvi un esempio come qui di seguito

<?php 
    class dog { 
     public $Name; 
     private function getName() { 
      return $this->Name; 
     } 
    } 

    class poodle extends dog { 
     public function bark() { 
      print "'Woof', says " . $this->getName(); 
     } 
    } 

    $poppy = new poodle; 
    $poppy->Name = "Poppy"; 
    $poppy->bark(); 
?> 

o un altro modo di utilizzare con le più recenti php

In PHP è possibile farlo utilizzando Riflessioni. Per invocare metodi protetti o privati ​​utilizzare il metodo setAccessible() http://php.net/reflectionmethod.setaccessible (impostarlo su TRUE)

19

Tecnicamente, è possibile richiamare metodi privati ​​e protetti utilizzando l'API di riflessione. Tuttavia, il 99% delle volte farlo è una pessima idea. Se è possibile modificare la classe, probabilmente la soluzione corretta è semplicemente rendere pubblico il metodo. Dopotutto, se è necessario accedervi al di fuori della classe, ciò sconfigge il punto di contrassegnarlo protetto.

Ecco un esempio di riflessione rapida, nel caso in cui questo è uno dei pochi casi in cui è davvero necessario:

<?php 
class foo { 
    protected function bar($param){ 
     echo $param; 
    } 
} 

$r = new ReflectionMethod('foo', 'bar'); 
$r->setAccessible(true); 
$r->invoke(new foo(), "Hello World");