Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: баг в интерпретаторе
Форумы портала PHP.SU » Разное » Прочее » баг в интерпретаторе

Страниц (1): [1]
 

1. OrmaJever - 18 Февраля, 2013 - 15:20:53 - перейти к сообщению
php 5.4
PHP:
скопировать код в буфер обмена
  1. class A {
  2.         public function __construct()
  3.         {
  4.                 unset($this);
  5.                 var_dump($this);
  6.         }
  7. }
  8. new A();

Веб сервер падает, хотя по идее должен быть нотис.
2. EuGen - 18 Февраля, 2013 - 15:51:36 - перейти к сообщению
Нет. Ничего не происходит, кроме выдачи notice (как в CLI, так и через веб-сервер):
CODE (bash):
скопировать код в буфер обмена
  1. PHP Notice:  Undefined variable: this in /test.php on line 7
  2.  
  3. Notice: Undefined variable: this in /test.php on line 7
  4. NULL

CODE (bash):
скопировать код в буфер обмена
  1. PHP 5.4.10 (cli) (built: Dec 21 2012 02:26:50)
  2. Copyright (c) 1997-2012 The PHP Group
  3. Zend Engine v2.4.0, Copyright (c) 1998-2012 Zend Technologies

CODE (bash):
скопировать код в буфер обмена
  1. Server version: Apache/2.4.3 (Unix)
  2. Server built:   Aug 23 2012 11:07:26


Пример: это:
CODE (bash):
скопировать код в буфер обмена
  1. user@host:/path$ cat test.php
  2. <?php
  3. class Foo
  4. {
  5.         function  __destruct()
  6.         {
  7.                 return new Foo();
  8.         }
  9. }
  10. new Foo();

->
CODE (bash):
скопировать код в буфер обмена
  1. Segmentation fault
3. OrmaJever - 18 Февраля, 2013 - 18:33:39 - перейти к сообщению
EuGen пишет:
Нет. Ничего не происходит, кроме выдачи notice (как в CLI, так и через веб-сервер):

эээ, так не честно! 5.4.11 под win, использую CLI, и он благополучно падает от вышеуказаного куска кода!
4. EuGen - 18 Февраля, 2013 - 19:02:18 - перейти к сообщению
Обновлю до 5.4.11 - проверю. Пока сказать не могу ничего.
5. LaoSun - 29 Марта, 2013 - 06:59:16 - перейти к сообщению
У меня php: 5.3.9, Apache API Version: 20051115.

Та же самая проблема - падает на такой конструкции.

После получасового ковыряния, удалось выявить приблизительный источник проблемы.
---
Для наглядности примера изменим конструкцию (падать после изменения все равно будет)
КОД: 1
PHP:
скопировать код в буфер обмена
  1. header('Content-Type: text/plain;');
  2. class A {
  3.         public $var     = "value";
  4.         public function __construct( $param = '' )
  5.     {
  6.                 $this;
  7.                 //unset($this);
  8.                 print_r( get_defined_vars( ) );
  9.         }
  10. }
  11. $A = new A( "some" );



Запускаем код выше и в браузере видим следующее.
ИТОГ: 1
PHP:
скопировать код в буфер обмена
  1. (
  2.     [param] => some
  3.     [this] => A Object
  4.         (
  5.             [var] => value
  6.         )
  7.  
  8. )



Раскоментируем unset на 7 мой строке и с первым же запуском Apache ляжет.


Теперь пробуем пофиксить падения

Вариант 1:
- Добавить get_defined_vars( ); перед unset.
(правильно без нечего, лищ для того, чтобы она была и вызывалась)


Вариант 2:
КОД: 2
PHP:
скопировать код в буфер обмена
  1. header('Content-Type: text/plain;');
  2. class A {
  3.         public $var     = "value";
  4.         public function __construct( $param = '' )
  5.     {
  6.                 $this;
  7.                 // ФИКС
  8.                 $t="t";
  9.                 $$t=$t;
  10.                 // Или тоже самое одной строкой
  11.                 //$$t=$t="t";
  12.                 unset($this);
  13.                 print_r( get_defined_vars( ) );
  14.         }
  15. }
  16. $A = new A( "some" );



Оба варианта не дают произойти падению (у меня, как у вас, попробуйте/скажите).


РАЗБОР ПОЛЕТОВ

из `КОД: 1` видно что this последняя в окружении и ее удаление вызывает собственно падение.

Если в `КОД: 2` закоментировать unset, то вы увидите
ИТОГ: 2
PHP:
скопировать код в буфер обмена
  1. (
  2.     [param] => some
  3.     [this] => A Object
  4.         (
  5.             [var] => value
  6.         )
  7.  
  8.     [t] => t
  9. )


Где `this` уже не последняя и как итог при ее удалении, все работает как надо.


P.S. почему get_defined_vars() не дает падать ХЗ, остается загадкой.

 

Powered by ExBB FM 1.0 RC1