php:防止创建对象级变量
由于输入错误,我创建了一个新的对象级别变量。这很难调试。虽然这可能是一个懒惰的特性,但有没有办法防止赋值创建对象级变量?我希望错误报告至少能告诉我是我做的,如果不是阻止的话php:防止创建对象级变量,php,variables,object,Php,Variables,Object,由于输入错误,我创建了一个新的对象级别变量。这很难调试。虽然这可能是一个懒惰的特性,但有没有办法防止赋值创建对象级变量?我希望错误报告至少能告诉我是我做的,如果不是阻止的话 <?php error_reporting(E_STRICT|E_ALL); class SearchField { var $field1; } $field = new SearchField(); $field->field1 = 'value1'; echo '<p>'.var_
<?php
error_reporting(E_STRICT|E_ALL);
class SearchField {
var $field1;
}
$field = new SearchField();
$field->field1 = 'value1';
echo '<p>'.var_dump($field).'</p>';
$field->feild1 = 'value2';
echo '<p>'.var_dump($field).'</p>';
$field = new SearchField();
$field->field1 = 'value1';
echo '<p>'.var_dump($field).'</p>';
?>
您可以使用魔术二传:
public function __set() {
throw new LogicException('Thou shalt not create variables on me');
}
尽管我想问,将这个添加到所有的类中,只是为了防备这个可能的错误,这是一个多么好的主意。您应该使用
protected
属性和显式getter和setter方法,养成使用$field->setField('foo')
的习惯,这是一种更好的OOP实践。好吧,protected/private不会阻止以这种方式创建新属性,但是-肯定地说,使用这种“保护”并不是所有情况下都采用这种机制。因为它没有什么意义。如果类有一些API,那么它应该使用它,其他的东西应该不受它的影响(当然,除非它们与实例中的其他东西冲突)@Alma“…并且养成使用[setters]的习惯”。如果您这样做,如果您胖手指一个setter,您将看到非常详细的错误消息。是的,它不会阻止属性的创建,但是当您使用getter和setter进行所有操作时,如果您的类上设置了一些无用的属性,那么这就无关紧要了。非常感谢。我认为这更多的是一种调试技术,而不是编码实践。当然,在编写新代码时,使用好的实践应该是显而易见的(并且应该始终是受欢迎的建议)。但是,当一个10年前的脚本被交给一个类时,这个类有几十个属性,命名约定很差,十几个左右的方法中有数千行只需要做一些更改,重写并不总是一个选项。@deceze使用getter/setter反模式或protected
实际上与“更好的OOP”无关;而且,属性本身没有什么错误,而getter/setter没有错误(参见C#);“OOPing”POPO或其他实体类型对象并没有真正的好处
public function __set() {
throw new LogicException('Thou shalt not create variables on me');
}