8

いくつかのメソッドの可視性を保護から公開に変更する PHP クラスを作成しようとしています。C ++でこれを実行できることを覚えていると思いますが、いくつか検索を行いましたが、PHPでは何も思いつきません. これがPHPでも可能かどうかは誰にもわかりませんか?

たとえば、次のクラスがあるとします。

 class ABC {
     protected function foo() {
          // Do something
     }
  }

  class DEG extends ABC {
      // can I make foo public now?
  }
4

3 に答える 3

13

次のように、基本クラスから派生するときにメンバーの可視性を変更できます。

class Base
{
    protected function foo() {}
}

class Derived extends Base
{
    public function foo() { return parent::foo(); }
}

プロパティでも同じことができます (protectedプロパティを として再定義しますpublic)。

ただし、ベース プロパティが である場合、private実際にはアクセシビリティが向上するわけではなく、同じ名前の新しいプロパティを宣言することに注意してください。private基本メソッドを呼び出そうとするとすぐに実行時エラーが発生するため、これは関数の問題ではありません。

于 2013-06-01T22:30:31.880 に答える
4
  • 派生クラスのメソッドを上書きして、可視性を高めることができます (例: protected->public)。新しい関数がその親を返すようにします。
  • 可視性を制限することはできませんが (例: public->protected)、呼び出し元のバックトレースをチェックし、外部クラスの場合は例外をスローするメソッドを実装できます。
  • リフレクション APIをいつでも使用して、可視性にあらゆる種類の変更を加えることができます。
于 2013-06-01T22:39:41.667 に答える
-2

はい、できます。PHPマニュアルから引用..

プロパティまたはメソッドの可視性は、宣言の前にキーワード public、protected、または private を付けることで定義できます。public と宣言されたクラス メンバーは、どこからでもアクセスできます。保護されていると宣言されたメンバーは、クラス自体内で、継承されたクラスおよび親クラスによってのみアクセスできます。private として宣言されたメンバーには、そのメンバーを定義するクラスのみがアクセスできます。

そしてそこからの例も..

class MyClass
{
    public $public = 'Public';
    protected $protected = 'Protected';
    private $private = 'Private';

    function printHello()
    {
        echo $this->public;
        echo $this->protected;
        echo $this->private;
    }
}

$obj = new MyClass();
echo $obj->public; // Works
echo $obj->protected; // Fatal Error
echo $obj->private; // Fatal Error
$obj->printHello(); // Shows Public, Protected and Private

編集: はい、公開メンバーと保護メンバーの可視性を変更できます。PHPマニュアルからの別の例..

/**
 * Define MyClass2
 */
class MyClass2 extends MyClass
{
    // We can redeclare the public and protected method, but not private
    protected $protected = 'Protected2';

    function printHello()
    {
        echo $this->public;
        echo $this->protected;
        echo $this->private;
    }
}

$obj2 = new MyClass2();
echo $obj2->public; // Works
echo $obj2->private; // Undefined
echo $obj2->protected; // Fatal Error
$obj2->printHello(); // Shows Public, Protected2, Undefined

?>
于 2013-06-01T22:28:09.697 に答える