【发布时间】:2011-10-12 03:34:36
【问题描述】:
为什么允许这样做?当您继承使用此范例的代码时,这非常令人困惑……尤其是当所述代码甚至不打扰正式声明公共属性,而是以某种随机方法设置它时。有没有办法阻止它(更改设置、使用某些关键字或使用界面)?
class Collision
{
public $Sort = "sort property";
public function Sort()
{
print 'sort function called<br/>';
return 'sort function return';
}
}
$a = new Collision();
print $a->Sort . '<br/>';
print $a->Sort() . '<br/>';
输出:
sort property
sort function called
sort function return
【问题讨论】:
-
此外,您可以使用魔术方法 __get 和 __set 封装 getter/setter,还可以使用 __call (php.net/manual/en/language.oop5.magic.php) - 但我也不会想到这种行为。
-
这段代码没有任何意外。它有一个共享相同文本的属性和方法;没有规则反对。除了设置一些编码实践和代码审查以确保未知的公共属性不会蔓延之外,我认为您可能不走运。恐怕这就是 PHP 的工作原理。
-
等等……什么……? :) 抱歉,我没有很好地阅读输出 - 是的,我同意,真的没有什么意外的! Sort() 调用一个函数,对属性进行排序,就像在大多数语言中一样,我猜...
-
只有一个解决方案,就是将 $sort 定义为 protected 或 private... 或者,定义 __set() 函数,它为所有变量返回 null(所以 $a->whatever将调用这个 __get() 魔术方法并返回 null)... 但是,该代码没有任何问题
-
@Quasdunk 还有哪些语言?不是 C#,不是 C++,不是 JavaScript……