PHP异常处理程序不产生任何错误

时间:2011-01-09 10:33:49

标签: php

HY,

以下代码不会像预期的那样抛出异常

   <?php

    class propertyObject {

    private $_properties = array('name' => null , 'dateofBirth' => null);

     function _get($propertyName)
      {
         if(!array_key_exists($propertyName, $this->_properties))
         {
  throw new Exception("Invalid Property Value"); 
 }
 if(method_exists($this,'get'.$propertyName))
  {
    return call_user_func(array($this, 'get'.$propertyName));
  }
  else 
  {
       return $this->_properties[$propertyName];
    }  
     }

     function _set($propertyName, $value)
     {
      if(!array_key_exists($propertyName, $this->_properties))
       {
        throw new Exception("The property value you are trying to set is not valid");
       }
      if(method_exists($this, 'set'.$propertyName))
       {
        return call_user_func(array($this,'set'.$propertyName));
       }
      else
       {
      return $this->_properties[$propertyName]=$value;
       }
     }

     function setdateofBirth($dob)
     {
         if(strtotime($dob) == -1)
    {
    throw new Exception ("Invalid Date of Birth. Please enter a value date");
   }
     $this->_properties['dateofBirth']=$dob;
      }    

      function sayHello()
       {
      echo "Hello! My name is $this->name and my D.O.B is $this->dateofBirth";
       }

     }

     ?>

以上内容保存为class.propertyObject.php,然后从另一个文件test.php中调用。 test.php的代码如下:

 <?php

   include('class.propertyObject.php');

   $newObj = new propertyObject();

   $newObj->name='Ryann';
   $newObj->dateofbirth='08/01/2009';

   $newObj->sayHello();
   $newObj->dateofBirth='hello';

?>

输出是:你好!我叫Ryann,我的D.O.B是08/01/2009。

在我看来,最后一句话$ newObj-&gt; dateofBirth ='hello';应抛出异常,因此应显示错误消息,但不会发出任何错误。此外,我更改了以下$ newObj-&gt; dateofbirth = '08 / 01/2009'中的值;到一个字符串名称,如约翰,它输出:你好!我叫Ryann,我的D.O.B是约翰。为什么没有为最后一个语句显示异常消息,或者为什么函数setdateofBirth($ dob)在非日期字符串值设置为$ dob时不会抛出任何异常。

2 个答案:

答案 0 :(得分:1)

不知道是否是格式化,但你正在使用

_set() and _get()

而不是

__set() and __get()

所以php只为你的对象创建一个新的属性dateOfBirth,甚至从未触及你的$ _properties数组......

答案 1 :(得分:0)

strtotime的文档说明了这个

  

返回成功时间戳,FALSE   除此以外。在PHP 5.1.0之前,这个   函数在失败时返回-1。

所以我猜你使用的是大于5.1的PHP版本。只需检查strtotime的返回值为false,而不是-1。