2013-06-18 11 views
5

Mam chronioną funkcję zdefiniowaną w ramach określonej klasy. Chcę móc wywoływać tę chronioną funkcję poza klasą w ramach innej funkcji. Czy to możliwe, a jeśli tak, to w jaki sposób mogę to osiągnąćCzy mogę/... wywołać funkcję chronioną poza klasą w PHP

class cExample{ 

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

    return $someVar 
    }//end of function 

}//end of class 


function outsideFunction(){ 

//Calls funExample(); 

} 
+2

Nie możesz. W pierwszej kolejności zniweczyłoby to cel posiadania chronionej funkcji.Możesz mieć publiczną metodę, która wywołuje metodę chronioną w twoim imieniu, ale dlaczego na początku ma być chroniona metoda? –

+0

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

Odpowiedz

8

to punkt OOP - enkapsulacji:

Prywatna

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

Protected

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

Public

Can be used anywhere. Inherited by child classes. 

Jeśli nadal chcą wywołać tę funkcję na zewnątrz, można zadeklarować metodę publiczną, która wyzwala swój chronioną metodę:

protected function b(){ 

} 

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

Można zastąpić tę klasę z innym gdzie zrobić to publiczny.

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

(Uwaga: to nie będzie działać z członków prywatnych)

Ale idea członków prywatnych i chronionych jest nie można nazwać z zewnątrz.

1

Jeśli chcesz udostępnić kod między swoimi zajęciami, możesz użyć cech, ale zależy to od tego, jak chcesz korzystać z funkcji/metody.

Zresztą

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

to będzie działać, ale należy pamiętać, że nie wiem, co twoja klasa jest wykonana z tej drogi. Jeśli zmienisz cechę, wszystkie twoje klasy, które jej używają, również zostaną zmienione. Dobrą praktyką jest także pisanie interfejsu dla każdej cechy, której używasz.

1

tutaj mogę dać jeden przykład jak poniżej

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

lub jeden inny sposób korzystać z najnowszej php

W PHP można to zrobić przy użyciu odbicia. Aby wywołać metody chronione lub prywatne, należy użyć metody setAccessible() http://php.net/reflectionmethod.setaccessible (po prostu ustawić ją na PRAWDA)

19

Możliwe jest wywoływanie prywatnych i chronionych metod za pomocą interfejsu API Reflect. Jednak 99% czasu robi to naprawdę zły pomysł. Jeśli możesz zmodyfikować klasę, to właściwym rozwiązaniem jest po prostu uczynienie tej metody publiczną. Wszakże jeśli potrzebujesz dostępu do niego poza klasą, to pokonuje punkt oznaczania go jako chronionego.

Oto krótki przykład odbicie, w przypadku jest to jedna z nielicznych sytuacji, gdy jest to naprawdę konieczne:

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

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