Strict Standards на PHP 5.4

Роберт

Аналитик
Могли бы пояснить, что такое Strict Standards?

Перенёс один проектик друга на свой сервер, а он ругается:
---
Strict Standards: Declaration of Moxiecode_LocalFileImpl::copyTo() should be compatible with Moxiecode_BaseFile::copyTo($dest) in tiny_mce\plugins\imagemanager\classes\FileSystems\LocalFileImpl.php on line 829
---

Это при том что у меня настройки:
error_reporting = E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED

Начал искать в сети что это, и много аналогичных тем где народ жалуется, и всегда заканчивается что им советуют откатиться до РНР 5.2, они вначале сопротивляются, но потом либо вообще отключают показ ошибок, либо говорят - Да, откатился до 5.2 и проблемы больше нету.

Но почему Strict Standards не отключается через ~E_STRICT?
И вообще что это? (и с чего она вдруг решает что copyTo() не совместим?)
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
единообразие API у классов-наследников - это как-бы не strict notice, а один из основных принципов OOP, называемый полиморфизмом, и при его нарушении код надо привести в соответствие
 

caballero

Новичок
Роберт

попросту говоря в классе наследнике функция параметром а в родительском нет.
Это синтаксическая ошибка никакие отключения ошибок тут не помогут. Просто исправь метод. Видимо в предыдущей версии пых хреново проверял соответствие сигнатур.
 

Вурдалак

Продвинутый новичок
Человек даже не знает, что такое «синтаксическая ошибка», а в соседних темах о высоких материях пытается говорить.
 

caballero

Новичок
Человек даже не знает, что такое «синтаксическая ошибка», а в соседних темах о высоких материях пытается говорить.
а какая еще? разве требование соответствия сигнатуры методов не часть СИНТАКСИСА языка? Разве ошибка вылетает не на этапе компиляции - то есть СИНТАКСИЧЕСКОГО анализа?
 

Вурдалак

Продвинутый новичок
Загляни, я там не знаю, в википедию, в толковый словарь, потом приходи.
 

caballero

Новичок
Загляни, я там не знаю, в википедию, в толковый словарь, потом приходи.
Я понимаю что википедия твой основной источник знаний. Но для разнообразия загляни в мануалы по языку PHP и посмотри есть ли там требование соответствия сигнатуры методов дочерних классов методам родительских.
 

Вурдалак

Продвинутый новичок
Я постараюсь объяснить как можно проще. При синтаксической ошибке твой скрипт бы завершил работу с «Parse error».
 

AmdY

Пью пиво
Команда форума
странно, там случаем не переопределён error_handler ?
 

AmdY

Пью пиво
Команда форума
Ой, это же платная приблуда, бей в морду их поддержке, за что деньги иначе платишь.
 

itprog

Cruftsman
AmdY
Ошибка же во время компиляции возникает, так что тут тупо не в том месте error_reporting правит.
 

caballero

Новичок
Я постараюсь объяснить как можно проще. При синтаксической ошибке твой скрипт бы завершил работу с «Parse error».
Не надо мне объяснять - не пальцем деланый. Понятно что это семантическая ошибка. Но в в большинстве мануалов и учебников нет разделения на главы - лексика синтаксис и семантика.
Это просто синтаксис и так его и употребляют. Пни поиск по форумам - сколько будет выражений "синтаксическая ошибка" и "семантическая ошибка"
ТС спросил о конкретной проблеме - зачем ему пудрить мозги несущественными в данном случае вещами вместо ответить на вопрос. Только чтобы блеснуть интелектом?

Исчерпывающий ответ был в третьем посте. Это на вопрос почему ошибка. Почему по разному в разных версиях - вопрос к разработчикам - лучше бы тестировали а не насиловали компилятор трейтами и прочими костылями
 

itprog

Cruftsman
Вурдалак
но стрикт возникает во время синтаксического разбора, а set_error_handler устанавливается рантаймно

http://codepad.viper-7.com/aQ966V

это то, что пытается донести caballero, не желая разбираться в чем-либо.
 

Вурдалак

Продвинутый новичок
Strict возникает во время анализа класса, да, но я не вижу проблемы: даже если бы set_error_handler() и класс находились в одном файле, то правка php.ini бы помогла (а автор, очевидно же, правит именно php.ini), а если в разных (ну, естественно, set_error_handler() вызывался бы раньше), то как раз
error_reporting() settings will have no effect and your error handler will be called regardless - however you are still able to read the current value of error_reporting and act appropriately.
У автора как раз, я уверен, второй случай.

Что тебя не устраивает?
 

itprog

Cruftsman
The following error types cannot be handled with a user defined function: E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING, and most of E_STRICT raised in the file where set_error_handler() is called.
а я думал совсем не ловится %) Тогда возможно.
 

Роберт

Аналитик
Если можно я немного переведу разговор в другую плоскость...

С одной стороны я понял что Strict Standards это не strict notice, но с другой стороны данная проблема появляется только начиная с PHP 5.3 (в версях 5.2.х и ранее всё работает отлично).

В версиях PHP 5.3.Х изменились правила работы с символическими линками на созданные объекты, например $entry =& new Moxiecode_ZipEntry($this); писать нельзя.
Вернее можно, но это вызывает ошибку типа STRICT - "не полное соответствие современным стандартам написания кода".

Но если этот код всё же работает, значит это не ошибка, а предупреждение?
 

Вурдалак

Продвинутый новичок
Называть это можно как угодно, но в следующих версиях PHP это может запросто перестать работать вовсе. Это предупреждения появляются специально, чтобы люди обратили внимание на ошибки/несоответствия кода с современными стандартами. Ты можешь игнорировать и дальше, но потом не жалуйся.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Вурдалак это еще долго не перестанет работать, тут дело в другом: если =& new просто приводит к лишней операции клонирования, то смена сигнатуры метода - ошибка проектирования, и ее стоит исправлять для избежания более серьезных проблем
 
Сверху