为什么PHP的魔术方法必须是public的?

7

在我的PHP类中,我使用神奇的方法,但是当我试图将它们设为私有时,会收到警告:

警告:魔术方法__get()必须具有公共可见性并且不能是静态的...

我不想让这些方法出现在Eclipse的自动完成中。(也许可以用phpdoc的方式?) 所以我的问题是,为什么这些方法必须是公共的?


2
只有重载魔术方法必须是公共的。这个要求不适用于像构造函数和析构函数之类的东西。 - BoltClock
4
这些方法将从类的外部上下文调用,因此它们需要是公共的,这有什么令人惊讶的呢? - Kerrek SB
1
@KerrekSB:从类上下文外部调用不可访问属性是指从外部调用__get方法吗?那么这就是答案! - TeChn4K
这是哪个PHP版本?我没有收到任何此类警告。 - Explosion Pills
@ExplosionPills 启用错误报告。 - Daniel W.
1个回答

9
因为您是从类外部的作用域调用这些方法。
例如:
// this can be any class with __get() and __set methods
$YourClass = new YourOverloadableClass();

// this is an overloaded property
$YourClass->overloaded = 'test';

上述代码将被“转换”为:

$YourClass->__set('overloaded', 'test');

稍后当您获取属性值时,可以这样做:
$var = $YourClass->overloaded;

这段代码被“转换”为:

$YourClass->__get('overloaded');

在每个场景下,魔术方法__get__set都会从类外部被调用,因此这些方法需要是public的。


我认为“public scope”不是一个词……至少它掩盖了实际情况 :-( - Kerrek SB
@Kerrek SB:我认为更合适的术语应该是“调用作用域”。 - BoltClock
你说的没错,公共范围并不能很好地描述发生了什么。我会修改答案,让它更清楚地说明正在发生的事情。 - Charles Sprayberry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接