2013-06-18 5 views
5

Ich habe eine geschützte Funktion, die innerhalb einer bestimmten Klasse definiert ist. Ich möchte in der Lage sein, diese geschützte Funktion innerhalb einer anderen Funktion außerhalb der Klasse aufzurufen. Ist dies möglich, und wenn ja, wie kann ich esKann ich/How to ... rufen Sie eine geschützte Funktion außerhalb einer Klasse in PHP

class cExample{ 

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

    return $someVar 
    }//end of function 

}//end of class 


function outsideFunction(){ 

//Calls funExample(); 

} 
+2

Sie können nicht. Das würde den Zweck einer geschützten Funktion zunichte machen.Sie könnten eine öffentliche Methode verwenden, die die geschützte Methode in Ihrem Namen aufruft, aber warum sollten Sie dann eine geschützte Methode verwenden? –

+0

Ein Duplikat von http://stackoverflow.com/q/12255740/2088851 – Voitcus

Antwort

8

erreichen, dass der Punkt der OOP ist - Verkapselung:

Privat

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

Geschützte

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

Öffentliche

Can be used anywhere. Inherited by child classes. 

Wenn Sie immer noch, dass die Funktion außerhalb auslösen wollen, können Sie eine öffentliche Methode erklären, dass Ihre geschützte Methode auslöst:

protected function b(){ 

} 

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

Sie diese Klasse mit einem anderen außer Kraft setzen können, wo Sie dies machen Öffentlichkeit.

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

(dies beachten Sie wird mit einem eigenen Mitglieder nicht)

Aber die Idee des privaten und geschützten Mitglieder von außerhalb aufgerufen NICHT.

1

Wenn Sie Code zwischen Ihren Klassen teilen möchten, können Sie Eigenschaften verwenden, aber es hängt davon ab, wie Sie Ihre Funktion/Methode verwenden möchten.

Wie dem auch sei

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(); 

Dies funktioniert, aber bedenken Sie, dass Sie nicht wissen, was Ihre Klasse dieser Art und Weise hergestellt wird. Wenn Sie das Merkmal ändern, werden alle Ihre Klassen, die es verwenden, ebenfalls geändert. Es ist auch eine gute Übung, eine Schnittstelle für jede Eigenschaft zu schreiben, die Sie verwenden.

1

hier kann ich Ihnen ein Beispiel geben, wie unten

<?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(); 
?> 

oder eine andere Art und Weise mit dem neuesten PHP

In PHP verwenden, können Sie dies mit Reflexionen tun. Um geschützte oder private Methoden aufzurufen, verwenden Sie die Methode setAccessible() http://php.net/reflectionmethod.setaccessible (setzen Sie sie einfach auf TRUE)

19

Technisch ist es möglich, private und geschützte Methoden über die Reflection-API aufzurufen. Aber 99% der Zeit ist eine wirklich schlechte Idee. Wenn Sie die Klasse ändern können, ist es wahrscheinlich die richtige Lösung, die Methode nur öffentlich zugänglich zu machen. Denn wenn Sie außerhalb der Klasse darauf zugreifen müssen, ist der Punkt, an dem Sie geschützt sind, nicht mehr vorhanden.

Hier ist eine kurze Reflexion Beispiel für den Fall, das ist eine der wenigen Situationen, in denen es wirklich notwendig:

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

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