强制PHP在非声明变量上出错?在物体?

时间:2008-12-28 19:54:09

标签: php typechecking

如果我拼错变量名,有没有办法强迫PHP爆炸(错误,无论如何)?如果我正在使用类的实例并且拼写变量的名称错误呢?

[我知道我应该习惯它,但也许有办法强制执行名称检查?]

谢谢!

编辑:抱歉,这不是很具体。这是代码,我想得到两个错误。现在我只得到一个(最后一行)。

error_reporting(E_ALL|E_STRICT);
class Joe {
    public $lastName;
}

$joe = new Joe();
$joe->lastNombre = "Smith";
echo "And here it is " . $jose;

7 个答案:

答案 0 :(得分:7)

这是我非常迅速地掀起的事情,以展示在发生类似情况时如何触发错误:

<?php

error_reporting( E_ALL | E_STRICT );

class Joe {
    public $lastName;

    public function __set( $name, $value ) {
        if ( !property_exists( $this, $name ) ) {
            trigger_error( 'Undefined property via __set(): ' . $name, E_USER_NOTICE );
            return null;
        }
        $this->$name = $value;
    }

    public function __get( $name ) {
        if ( !property_exists( $this, $name ) ) {
            trigger_error( 'Undefined property via __get(): ' . $name, E_USER_NOTICE );
            return null;
        }
        return $this->$name;
    }
}

$joe = new Joe();
$joe->lastNom = "Smith";
echo $joe->lastNom , "\n";

?>

答案 1 :(得分:2)

你可以尝试:

error_reporting(E_ALL|E_STRICT);

编辑:好的,我现在已经阅读了更新的问题。我觉得你运气不好。这在PHP中是有效的。有人说这是一个特色。 :)

答案 2 :(得分:2)

来自error_reporting上的PHP文档:

// Reporting E_NOTICE can be good too (to report uninitialized
// variables or catch variable name misspellings ...)
error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);

答案 3 :(得分:1)

您可以在代码中使用它:

error_reporting(E_ALL);

或在php.ini

php_error_reporting=5

http://us2.php.net/error_reporting

答案 4 :(得分:1)

设置error_reporting以包含E_NOTICE可能会有所帮助。每当您使用未定义的变量时,它都会显示通知/错误(请注意,它不会停止执行)。

答案 5 :(得分:1)

知道这是一篇旧帖子 - 但偶然发现它寻找解决方案。

这是我的最终解决方案:

我有一个我的类扩展的抽象类,会在magic __get和__set上引发错误。

这是令人讨厌的 - 但它有效![/ p>

它类似于上面的建议 - 但也在方法声明中添加了“final”以阻止人们覆盖它。

我们还使用代码嗅探器来捕获这些 - 但我希望在编码时“实时”获取我的错误消息,而不必等待来自嗅探器的报告。 (人们也可以忽略嗅探报告!)

以下示例代码

   <?php
/**
 * Abstract
 * Some default Abstract functions that everything should extend
 *
 * @package    example
 * @subpackage lib
 */

/**
 * Class mh_abstract
 * Some default MH Abstract functions that everything should extend
 *
 * @package    example
 * @subpackage lib
 */
abstract class lib_abstract
{
    /**
     * Throws an error if php magic set is called
     *
     * @param string        $key
     * @param string|object $value
     *
     * @throws Exception When trying to set a new class property
     */
    final public function __set($key, $value)
    {
        // get if the thing we are trying to set is a object
        if(is_object($value))
        {
            // if so let's just report it's name, not the full object
            $value = 'object:'.get_class($value);
        }

        // throw the error!
        throw new mh_lib_error_dev_unknownClassProperty('Tried to set new property '.$key.' with value '.$value);
    }

    /**
     * Throws an error if php magic get is called
     *
     * @param string $key
     *
     * @throws Exception When trying to set a new class property
     */
    final public function __get($key)
    {

        // throw the error!
        throw new mh_lib_error_dev_unknownClassProperty('Tried to get new property '.$key);
    }
}

答案 6 :(得分:0)

要捕获未声明的属性,您可以设置_ _Set()魔术方法来捕捉它们

function __set($sKey, $sValue)
{
   // any setter data should be *returned* here

   // NOTE: this function will only get called if the property is not
   // publicly accessible.
   trigger_error("Non-existing property name ".$sKey, E_USER_WARNING);
}