PHP改变方法/函数可见性


PHP change method/function visibility

我正在尝试编写一个PHP类,其中我将一些方法的可见性从受保护到公共。我记得你可以在c++中做到这一点,但我做了一些搜索,我没有在PHP中找到任何东西。有人知道这在PHP中是否可行吗?

例如,假设这个类:

 class ABC {
     protected function foo() {
          // Do something
     }
  }
  class DEG extends ABC {
      // can I make foo public now?
  }

当从基类派生时,可以像这样更改成员的可见性:

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

您也可以对属性执行相同的操作(将protected属性重新定义为public)。

但是,请注意,如果基本属性是private,则实际上不会增加其可访问性,而是声明具有相同名称的新属性。这不是函数的问题,因为如果您试图调用private基方法,您将立即获得运行时错误。
  • 你可以在派生类中覆盖一个方法来提高它的可见性(例如protected->public)。让新函数返回它的父函数。
  • 你不能这样做来限制它的可见性(例如public->protected),但是你可以实现一个方法来检查调用者的回溯,如果它是一个外部类则抛出一个异常。
  • 你总是可以使用反射API对可见性做各种改变。

是的,可以做到。引用自PHP手册…

属性或方法的可见性可以通过前缀用关键字public、protected或private声明。类声明为public的成员可以在任何地方访问。成员声明Protected只能在类本身中访问继承类和父类。声明为私有的成员只能是由定义该成员的类访问。

还有那里的例子…

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

Edit:是的,您可以更改公共和受保护成员的可见性。另一个来自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
?>