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

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

但是,请注意,如果基础属性是,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 的类成员可以在任何地方访问。声明为受保护的成员只能在类本身内以及被继承类和父类访问。声明为私有的成员只能由定义该成员的类访问。

还有那里的例子..

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 回答