22

特定のクラス内で定義されている保護された関数があります。この保護された関数を別の関数内のクラス外で呼び出せるようにしたいと考えています。これは可能ですか?もしそうなら、どうすればそれを達成できますか?

class cExample{

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

   return $someVar
   }//end of function

}//end of class


function outsideFunction(){

//Calls funExample();

}
4

8 に答える 8

56

技術的には、リフレクション API を使用してプライベート メソッドと保護されたメソッドを呼び出すことができます。ただし、99% の場合、そうするのは本当に悪い考えです。クラスを変更できる場合、正しい解決策はおそらくメソッドを公開することです。結局のところ、クラス外でアクセスする必要がある場合は、保護されているとマークする意味がなくなります。

これが本当に必要な数少ない状況の 1 つである場合に備えて、簡単なリフレクションの例を次に示します。

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

$r = new ReflectionMethod('foo', 'bar');
$r->setAccessible(true);
$r->invoke(new foo(), "Hello World");
于 2013-06-18T16:42:45.550 に答える
20

それがOOPのポイントです-カプセル化:

プライベート

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

保護された

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

公衆

Can be used anywhere. Inherited by child classes.

その関数を外部でトリガーしたい場合は、保護されたメソッドをトリガーするパブリック メソッドを宣言できます。

protected function b(){

}

public function a(){
  $this->b() ;
  //etc
}
于 2013-06-18T16:31:28.960 に答える