Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/262.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/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:防止创建对象级变量_Php_Variables_Object - Fatal编程技术网

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');
}