Заставить 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_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);
}