Заставить PHP ошибаться по необъявленным переменным? В предметах?

есть ли способ заставить PHP взорваться (ошибка, что угодно), если я неправильно пишу имя переменной? Как насчет того, что я использую экземпляр класса, и я неправильно пишу имя переменной?

[Я знаю, что я должен просто привыкнуть к этому, но может есть способ принудительно проверять имя?]

спасибо!

Edit: извините, это было не очень конкретно. Вот код, и я хотел бы получить два ошибки. Сейчас у меня только один (для последней строки).

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

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

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";

?>

из документов PHP на error_reporting:

// 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);

вы можете попробовать:

error_reporting(E_ALL|E_STRICT);

EDIT: хорошо, теперь я прочитал обновленный вопрос. Думаю, тебе не повезло. Это действительно в PHP. Некоторые говорят, что это особенность. :)


Вы можете использовать это в коде:

error_reporting(E_ALL);

или это в PHP.ini

php_error_reporting=5

http://us2.php.net/error_reporting


установка error_reporting для включения E_NOTICE может несколько помочь. Он имеет тенденцию отображать уведомление / ошибку всякий раз, когда вы используете неопределенную переменную(обратите внимание, что она не останавливает выполнение).


знаю, что это старый пост, но наткнулся на него в поисках решения.

Это мое окончательное решение:

у меня есть абстрактный класс, который расширяют мои классы, который выдает ошибку на magic __get и __set.

это противно - но это работает удовольствие!

это похоже на предложения выше, но также добавили "final"в объявление метода, чтобы остановить перезапись.

мы также используем сниффер кода, чтобы поймать это - но я хотел получить сообщения об ошибках "вживую", как я закодировал, вместо того, чтобы ждать отчета от сниффера. (Также люди могут игнорировать отчеты sniff!)

пример кода ниже

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

чтобы поймать необъявленное свойство, вы можете установить магический метод _ _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);
}