我尝试验证PHP中的select字段。我准备了代码,但解释员给我这个通知:
注意:未定义的属性:Test5 :: $ property in /opt/lampp/htdocs/mvc3/controller/admin/test5.php第22行NULL
当我没有从列表中选择任何内容时,会出现问题。有谁知道如何解决这个问题?
我提供代码:
<form action="test5.php" method="post">
<select name="select">
<option selected="selected" disabled="disabled">Select...</option>
<option>Apple</option>
<option>Raspberry</option>
<option>Banana</option>
<option>Pineaple</option>
</select>
<button type="submit" name="button">Send</button>
</form>
<?php
class Test5 {
private $paramName, $default;
public function getParam($paramName, $default = null) {
if (isset($_POST[$paramName])) {
$this->property = trim($_POST[$paramName]);
}
return $this;
}
public function getProperty() {
return $this->property;
}
}
$test5 = new Test5;
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$test5->getParam('select', false);
var_dump($test5->getProperty());
}
?>
答案 0 :(得分:3)
当您从列表中选择任何内容时,您永远不会设置您尝试获取的属性。尝试将属性property
添加到类中。它将null
作为默认值:
private $property;
private $paramName;
private $default;
您可以在构造函数中设置默认值,例如:
public function __construct() {
$this->property = 'lorem ipsum';
}
答案 1 :(得分:1)
无论如何,您都必须定义$property
。因此,您可以执行以下操作:
class Test5 {
private $paramName, $default;
/**
* Although the default is NULL, this
* demonstrates you can set to just about anything
*/
private $property = null;
public function getParam($paramName, $default = null) {
if (isset($_POST[$paramName])) {
$this->property = trim($_POST[$paramName]);
}
return $this;
}
public function getProperty() {
return $this->property;
}
}
$test5 = new Test5;
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$test5->getParam('select', false);
var_dump($test5->getProperty());
}
这样可以防止默认情况下设置的错误。通过默认类中未分配的属性返回undefined
,因为它未定义。通过使用null值定义它,可以为输入验证提供一些错误检查空间。
从PHP手册
中查看答案 2 :(得分:0)
如果没有赋值,默认情况下你的代码将返回NULL,或者指定一些不同的默认值(在if(isset($_POST[$paramName])
中添加一个为属性赋予一些默认值的else)或保持原样。该通知只是警告您,您可以通过在类代码上方添加error_reporting(0);
来关闭这些通知。
答案 3 :(得分:0)
因为它是无法解释的,所以只有当isset statment返回true时才定义它,你还需要其他的法则。
undefined method ___ for nil:NilClass
答案 4 :(得分:0)
此条件
时发生错误if (isset($_POST[$paramName])) {
$this->property = trim($_POST[$paramName]);
}
评估为false
,因为property
中不存在名称为Test5
的媒体资源。
但是,如果条件的计算结果为true
,那么当您在te条件的主体中为其赋值时,它将以public
可见性动态创建。
为避免错误,请按照建议声明属性:
class Test5
{
private $property;
// ...
}
供参考,见: