我正在尝试编写一个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
?>