PHP更改方法/功能可见性

时间:2013-06-01 22:24:54

标签: php oop

我正在尝试编写一个PHP类,在其中我将一些方法的可见性从protected更改为public。我相信我记得你可以在C ++中做到这一点,但我做了一些搜索,我没有在PHP中提出任何相关内容。有谁知道这在PHP中是否可行?

例如,假设这个类:

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

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

3 个答案:

答案 0 :(得分:13)

您可以在从这样的基类派生时更改成员的可见性:

class Base
{
    protected function foo() {}
}

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

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

但是,请注意,如果基本属性为private,那么您实际上不会增加​​其可访问性,而是声明具有相同名称的新属性。这不是函数的问题,就像您尝试调用private基本方法一样,您会立即收到运行时错误。

答案 1 :(得分:4)

  • 您可以覆盖派生类中的方法以提高其可见性(例如protected-> public)。使新函数返回其父级。
  • 您无法限制其可见性(例如,public-> protected),但您可以实现一种方法来检查调用方的回溯,如果是外来类,则会发生异常。
  • 您始终可以使用reflection API对可见性进行各种更改。

答案 2 :(得分:-1)

是的,可以做到。引自PHP manual ..

  

可以通过为前缀添加前缀来定义属性或方法的可见性   声明与关键字public,protected或private。类   公开的成员可以随处访问。成员宣布   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

修改:是的,您可以更改公共成员和受保护成员的可见性。 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

?>