Notice для неизвестных переменных класса

BelStudent

целеустремлённый чел
Notice для неизвестных переменных класса

Обычно, если пытаешься сделать такое: ++$num, то выбрасывается notice, что "Undefined variable: num". Это позволяет избежать ошибок.
Но если у тебя класс и ты пытаешься сделать так ++$this->num и num негде ранее не определен, то не выдаётся НИКАКИХ предупреждений и нотисов.

Случайно в работе удалил символ и получил ++$this->nu, и потом полезли хрен знает какие ошибки, чтобы найти это место и исправить на ++$this->num потребовалось несколько часов. Поэтому меня очень волнует вопрос: как сделать так чтобы выдавались notice, если пытаюсь что-то делать с неинициализованной (неизвестной) переменной в классе?
 

ys

отодвинутый новичок
У меня все вылазит с E_ALL, как и положено.
 

BelStudent

целеустремлённый чел
У меня стоит E_ALL | E_STRICT, ничего не показывает. ПРОверь на этом коде:
Код:
<?php
class A
{ public function __construct()
    {   ++$this->num;
    }
}
new A();
?>
У меня пусто.
 

Активист

Активист
Команда форума
BelStudent
У меня таже фигня, в 70% случаях валится нотис, в 30% , нет, причем, замечано только под виндой) обнови PHP.
 

BelStudent

целеустремлённый чел
Активист
Да, похоже пора обновляться. А у тебя какая верся PHP стоит? 5.3?
 

ys

отодвинутый новичок
Хм. Так тоже нотиса нету.

Есть "Undefined property", только при попытке получить неопределенную переменную класса:

Код:
<?php
class A
{ public function __construct()
    {   $num = $this->num;
    }
}
new A();
?>
 

BelStudent

целеустремлённый чел
А у тебя какая версия php?
Давайте, кто тестирует, говорит какая у него версия php, чтобы определить наконец на какой версии появится notice. (Может кто альфа юзает новых версий)

Я на локальном компе сборочку юзаю StpServer, там php 5.2.6.
 

ys

отодвинутый новичок
Непонятно, почему не ругается в таком случае, если заменить на:
$num = $this->num++;

По идее (в таком случае), не должно ругаться только если:

$num = ++$this->num;

-~{}~ 24.08.09 12:40:

PHP 5.2.9
 

BelStudent

целеустремлённый чел
Ну кто напишет о результате в php 5.3?
Или сразу писать о баге на php.net (или на zend.com, куда точно не знаю :( )?
 

BelStudent

целеустремлённый чел
В чате подсказали решение:
$this->num = $this->num + 1;
Знаю кастыль, но решает проблему.
 

ys

отодвинутый новичок
FractalizeR

Не решает задачи, поставленной в топике.
 

FractalizeR

Новичок
На время отладки я бы предложил реализовать __get метод:
PHP:
<?php
error_reporting(E_ALL);
class A
{ 
	//public $num = 0;
	public function __construct() {
		$this->num += 1;
    }

	public function __get($name) {
		if(!isset($this->$name)) {
			throw new Exception(__CLASS__ . ": access to undefined property '$name'!");
		}
		return($this->$name);
	}
}
new A();
?>
Так будет сразу видно, есть ли попытка обращения к неопределенной переменной
 

BelStudent

целеустремлённый чел
FractalizeR
Ты мозг, я до этого не додумался. Спасибо.
Наверное сделаю класс с таким методом и буду везде его наследовать.

p.s. Отправил проблему в багрепорт php.net. Открыли тикет:
http://bugs.php.net/bug.php?id=49348
 

FractalizeR

Новичок
Наследовать... Некрасиво как-то. Впрочем, наверное, можно и так, но что вы будете делать, когда баг пофиксят и код станет не нужен? Править все классы и убирать наследование?

Мне кажется, лучше в конец каждого вашего класса перед "}" поставить коммент типа //#$@EOC, а потом grep'ом пробежаться по проекту и заменить этот коммент на определение метода __get, которое вам нужно. Причем, определение само заключить в комменты типа //#$@S .... //#$@E, чтобы его быстро из класса удалить можно было. В релизе ведь эти проверки станут не нужны, правильно? Вы ведь добавляете отладочный код для себя на время разработки. Напишите себе пару скриптов для добавления этого метода в классы, в которых его еще нет и для удаления при формировании релиза и все дела.
 

BelStudent

целеустремлённый чел
А что мешает мне похожим способом удалить "extends MyDebugClass" ?
 

FractalizeR

Новичок
Наверное, ничего. Но все равно мне почему-то не нравится решение с наследованием. Хотя аргументов "против" у меня пока нет.
 

phprus

Moderator
Команда форума
triumvirat
Чукча — не читатель?

Вдумчиво читаем первое предложение второго абзаца первого сообщения темы.
 
Сверху