Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
令人困惑的PHP OO场景_Php_Oop - Fatal编程技术网

令人困惑的PHP OO场景

令人困惑的PHP OO场景,php,oop,Php,Oop,为什么允许这样做?当您继承使用此范例的代码时,会非常混乱。。。特别是当所说的代码甚至不用正式声明公共属性,而是用一些随机方法设置它时。有没有办法防止它(更改设置、使用某些关键字或使用接口) 这是允许的,因为PHP区分属性和方法。当访问它们时,PHP使用函数括号()的存在(或不存在)来确定是否引用了属性或方法。因此,计算机没有歧义,即使它可能会让人困惑。=)我想用一种可能不寻常的方式来说明这一点 多年前,在苏联,有一只鞋 制造厂。这种植物用皮革做鞋。植物 有配额,做这么多鞋。过了一会儿,工人们发现

为什么允许这样做?当您继承使用此范例的代码时,会非常混乱。。。特别是当所说的代码甚至不用正式声明公共属性,而是用一些随机方法设置它时。有没有办法防止它(更改设置、使用某些关键字或使用接口)


这是允许的,因为PHP区分属性和方法。当访问它们时,PHP使用函数括号()的存在(或不存在)来确定是否引用了属性或方法。因此,计算机没有歧义,即使它可能会让人困惑。=)

我想用一种可能不寻常的方式来说明这一点

多年前,在苏联,有一只鞋 制造厂。这种植物用皮革做鞋。植物 有配额,做这么多鞋。过了一会儿,工人们发现 没有任何规则规定他们必须生产这么多任何尺寸的产品 所以他们开始大量生产同样尺寸的鞋子,这样他们就可以去了 早点回家

过了一段时间,当局意识到了这一点,并开始采取行动 规则。一项规定说,他们必须创造如此多的特定规模; 然后,工厂在同一尺寸的鞋子上贴上不同尺寸的印章。然后 规定颁布了,这么多的鞋子必须用这么多的原料制成 皮革。因此,工厂生产的鞋子有3“鞋底,相同的材质 不管大小。最终,工厂关闭了

故事的寓意?如果您的开发人员不明白遵守您精心制定的规则符合他们的最大利益,那么您可能会遇到问题。如果您的规则没有受到谨慎和必要的指导,您可能会遇到问题(在PHP中)。如果你讨厌PHP,无法忍受它如何做一些事情,那么你可能会更好地使用其他语言

正如我的评论所说,最谨慎和最便宜的(就花费的时间而言)是建立谨慎的规则,而不是创建一些错误的构造(比如神奇的getter/setter和其他cruft),因为狡猾的程序员可以而且可能会这样做(有时甚至在没有意识到的情况下,例如在函数中创建的公共属性)绕过它们


建立有意义的规则,让每个人都理解并接受。这是我的建议,它本质上是观点多于一切。但我希望它能有所帮助。

此外,你可以用神奇的方法来封装getter/setter,比如get和set,还可以使用call()-但我也没料到会出现这种行为。这段代码没有任何意外。它有一个属性和一个方法共享同一个文本;没有任何规则反对这一点。除了设置一些编码实践和代码检查以确保未知的公共属性不会悄悄进入,我认为你可能运气不好。这只是抱歉,我没有很好地阅读输出-是的,我同意,真的没有什么意外!Sort()调用函数,对属性进行排序,就像大多数语言一样,我想…只有一种解决方案,那就是将$Sort定义为受保护的或私有的…或者,define\u set()函数,该函数只为所有变量返回null(因此$a->将调用此_uget()魔术方法并返回null的任何内容)……然而,这并没有什么错code@Quasdunk什么其他语言?不是C++,不是C++,不是JavaScript…谢谢你的解释!我想没有办法像我那样限制类的定义了。如果属性定义不在那里,我就可以使用α-Stand魔法来禁止它,但我必须从GATY开始使用反射进行点击。如果只定义了方法,则pe($this->Sort)为NULL。嗯..不,不是AFAIK。您可以使用方法_exists和属性_exists在一个u_集魔术函数中,并且不允许两者都返回true,但这不太好。。。
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