2017-07-18 50 views
-2

我尝试验证PHP中的选择字段。我编写的代码,但解释器返回我做出以下声明:未定义的属性,如果值为空

公告:未定义的属性:TEST5 :: $财产 /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

我没仔细看过,但这尖叫我的脸'$ default = null' – Andreas

+2

尝试添加$ property的私有属性'private $ paramName,$ default,$ property;' –

回答

0

你的代码将返回NULL默认情况下,如果没有指定值,无论是分配一些不同的默认值(在if(isset($_POST[$paramName])添加一些默认值分配财产的人)或保持原样。通知只是警告你,你可以通过在课程代码上面添加error_reporting(0);来关闭这些通知。

+1

不,请不要通过关闭错误报告来解决问题。解决它们。 –

+0

好的,解决问题的方法就是提醒他可以隐藏该通知,但是出于某种原因正在显示。 – unm4sk

3

当你没有从列表中选择任何东西时,你从来没有设置过你试图得到的属性。尝试将该属性property添加到课程中。这将有null为默认值:

private $property; 
private $paramName; 
private $default; 

可以在构造函数中设置的默认值,例如:

public function __construct() { 
    $this->property = 'lorem ipsum'; 
} 
+2

不需要将其设置为null。如果你定义一个属性而不给它赋值,它将默认为'null'。 –

+0

你是对的,不好的例子!我将编辑我的答案 – micster

+0

'__construct()'方法不是必需的。您可以在定义其可见性时设置该值。 EX:'private $ property ='tacos';' – Zaky

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因为它没有定义。通过使用空值定义它会为输入验证提供一些错误检查空间。

看看这个从PHP手册

PHP: Properties - Manual

+1

'var $ property'?使用'var'是一个古老的PHP4文物。您应该设置可见性。只需添加它与添加其他人的方式相同:'private $ paramName,$ default,$ property'。 (更好的是将它自己的行上的每个var都设置为自己的可见性,尽管如此)。如果你不给它赋值,默认情况下它将是'null'。 –

+0

但是至少* PHP 5.6 *可以预先定义一个值。所以,我正在证明这种能力,以防* * op没有试图简单地默认返回。 [PHP手册页在此](http://php.net/manual/en/language.oop5.properties.php) – Zaky

+0

现在你已经失去了我。你可以继续使用'var $ property = null;',但是使用''public $ property = null;',甚至是'public $ property;'。在这种情况下,它可能应该是'private $ property;'而不是。为什么你会在同一个班级混合新旧风格?只要保持一致。我不明白你的意思:_“PHP 5.6你可以预先定义一个值”_? –

0

因为它是undifiend你定义它只有isset statment返回true,你需要别人statment也。

<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]); 
     } 
else{ $this->property=" ";} 
     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

的错误,当这个条件

if (isset($_POST[$paramName])) { 
    $this->property = trim($_POST[$paramName]); 
} 

评估为false因为名字property属性不存在Test5发生。

但是,如果条件的计算结果为true,则会在为te条件主体中的值赋予它时动态创建它,并且会显示public

要避免错误,财产申报作为已经建议:

class Test5 
{ 
    private $property; 

    // ... 
} 

仅供参考,请参阅:

相关问题