Заставить PHP выдавать ошибку по необъявленным переменным? В объектах? - PullRequest
7 голосов
/ 28 декабря 2008

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

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

Спасибо!

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

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

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

Ответы [ 7 ]

7 голосов
/ 28 декабря 2008

Вот кое-что, что я очень быстро описал, чтобы показать, как можно вызвать ошибки, когда что-то подобное происходит:

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

?>
2 голосов
/ 28 декабря 2008

Из документации 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);
2 голосов
/ 28 декабря 2008

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

error_reporting(E_ALL|E_STRICT);

РЕДАКТИРОВАТЬ: ОК, я прочитал обновленный вопрос. Я думаю, что вам не повезло. Это действительно в PHP. Некоторые говорят, что это особенность. :)

1 голос
/ 13 августа 2010

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

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

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

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

Это похоже на предложения, приведенные выше, но также добавило '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);
    }
}
1 голос
/ 28 декабря 2008

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

1 голос
/ 28 декабря 2008

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

error_reporting(E_ALL);

или это в php.ini

php_error_reporting=5

http://us2.php.net/error_reporting

0 голосов
/ 31 декабря 2008

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