E_STRICT выносит мне мозг

Духовность™

Продвинутый новичок
Включил строгий контроль ошибок: E_ALL | E_STRICT
PHP Version 5.3.1

Мне совершенно не понятно почему php имеет как бы две стороны медали. С одной стороны можно писать так, а с другой - так писать нельзя. Вот примеры:

1.
PHP:
// Метод родителя: 
save(Base_Model  $object)
// Наследника: 
save(Module_Category_Model_Category $object)
trict Standards: Declaration of Module_Category_Mapper_Category::save() should be compatible with that of Module_Common_Mapper_Common::save()
- я что-то не понимаю. а как же полиморфизм? какой смысл в полиморфном методе, если мы не можем предопределить тип-хинт? Как это сточки зрения ООП - правильно или нет?

2.
Ошибки в стиле "Only variables should be passed by reference" - тысяча их!
PHP:
..
 print_r($params); // Array( [ajax] => AdvertEmail,  [id] => 1773)
list($a, $b) = each(foo($params)); // each принимает ссылку на массив, так нельзя
почему не в строгом режиме так МОЖНО? Почему подобные конструкции по дефолту не вываливают никаких ошибок? PHP поощряет невнимательность? Или как это называется?

3.

PHP:
class My_Datetime extends DateTime
{
    /**
     * @see parent::createFromFormat()
     */
    public static function createFromFormat($format, $time, DateTimeZone $timezone = null)
    { 
// ....
При E_STRICT:
Strict Standards: Declaration of My_Datetime::createFromFormat() should be compatible with that of DateTime::createFromFormat() in Z:\home\....\Type\Datetime.php on line 45
- что я не так тут делаю?
 

fixxxer

К.О.
Партнер клуба
я что-то не понимаю. а как же полиморфизм? какой смысл в полиморфном методе, если мы не можем предопределить тип-хинт? Как это сточки зрения ООП - правильно или нет?
как раз все правильно, защищается неизменность контракта при наследовании, это ок. смысл в том что при вызове $Foo->bar($Baz) тебе должно быть похрену $Foo это реализация базового класса или наследника - а без стрикта как раз это нарушается
 

korpus

злой бобёр
Я у себя на денвере с PHP5.3.1 протестировал этот код и ошибок мне php не выдал
PHP:
<?php
ini_set("error_reporting", E_ALL | E_STRICT);

class My_Datetime extends DateTime
{
    /**
     * @see parent::createFromFormat()
     */
    public static function createFromFormat($format, $time, DateTimeZone $timezone = null)
    { 
	
	}
}

?>
 

korpus

злой бобёр
2.
Ошибки в стиле "Only variables should be passed by reference" - тысяча их!
PHP:
 print_r($params); // Array( [ajax] => AdvertEmail,  [id] => 1773)
list($a, $b) = each(foo($params)); // each принимает ссылку на массив, так нельзя
each() используется для итерации внутри массива. Странно помещать туда функцию.
Но вот код ниже у меня сработал без ошибок:
PHP:
<?php

ini_set("error_reporting", E_ALL);


$c=array('c'=>'Crome');
function foo()
{
	global $c;
	return $c;
}

list($a, $b)=each(foo());
echo $a.' -> '.$b;
?>
Это наверное потому, что функция возвращает ссылку на массив, по которому производятся иттерации, а не создаёт его каждый раз заново. Вполне логичное поведение, не надо сувать в each() что попало. Возможно в старых версиях было по другому.
 

AmdY

Пью пиво
Команда форума
korpus
как вы умудряетесь такое придумывать?
 

Духовность™

Продвинутый новичок
Я у себя на денвере с PHP5.3.1 протестировал этот код и ошибок мне php не выдал
PHP:
<?php
ini_set("error_reporting", E_ALL | E_STRICT);

class My_Datetime extends DateTime
{
    /**
     * @see parent::createFromFormat()
     */
    public static function createFromFormat($format, $time, DateTimeZone $timezone = null)
    { 
	
	}
}

?>
не может быть
http://phpclub.ru/talk/threads/strict-standart-и-наследование-стандартных-объектов-ругается-почему.66083/
 

korpus

злой бобёр
Скопировал код сверху и запустил на Денвере. Как не было ошибок так и нету!
triumvirat, теперь догадайся, что мы деолаем не так, что у нас разный результат получается! ;Ъ
 

Вурдалак

Продвинутый новичок
У меня PHP 5.3.3 и я не могу добиться этого сообщения:
PHP:
<?php

error_reporting(E_ALL | E_STRICT);
ini_set('display_errors', 1);

class A
{
    public function test(Exception $a = null)
    {

    }
}

class B extends A
{
    public function test(Datetime $A = null)
    {

    }
}

A::test(); // Strict Standards: Non-static method A::test() should not be called statically
А про переопределение метода с другой сигнатурой ничего не выдаёт. Твой код тоже подобную ошибку не выводит.
 

korchasa

LIMB infected
Вурдалак
Это на этапе интерпретации проверяется. Либо установи error_reporting в php.ini, либо вынеси классы в другой файл.
 

korpus

злой бобёр
Вурдалак
Это на этапе интерпретации проверяется. Либо установи error_reporting в php.ini, либо вынеси классы в другой файл.
Только что проверил, установив строгий уровень ошибок в php.ini. Странно, но теперь ошибка выдаётся. С чего бы это? Я же код пишу после задания error_reporting(E_ALL | E_STRICT); в моём скрипте
 

HraKK

Мудак
Команда форума
Только что проверил, установив строгий уровень ошибок в php.ini. Странно, но теперь ошибка выдаётся. С чего бы это? Я же код пишу после задания error_reporting(E_ALL | E_STRICT); в моём скрипте
Это на этапе интерпретации проверяется.
 

Вурдалак

Продвинутый новичок
korpus, не знаю где почитать, но подумай логически: порядок расположения кода классов (и функций) в одном файле значения не имеет: всё подгрузится ДО начала интерпретации (во время перевода кода в промежуточный). Соответственно, твоя инструкция error_reporting(...) будет выполнена только после загрузки в оперативную память классов.
 

korpus

злой бобёр
Вурдалак
Вот это мы с тобой только сказали. Больше никто не знает, как это работает. Обычно на этот случай должен быть мануал или хоть авторитетная запись в каком-нибудь PHP-блоге. Мне вот не кажется такое поведение PHP логичным. Кроме того, раз такое поведение не задокументировано, то разработчики движка PHP могут его в определённый момент взять и поменять. Короче это вилами на воде писано...и это не есть хорошо. Думаю, ты со мной согласишься.
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Вурдалак
Вот это мы с тобой только сказали. Больше никто не знает, как это работает. Обычно на этот случай должен быть мануал
А ты его читать пробовал?
http://www.php.net/manual/en/function.error-reporting.php
Warning
Most of E_STRICT errors are evaluated at the compile time thus such errors are not reported in the file where error_reporting is enhanced to include E_STRICT errors (and vice versa).
 
Сверху