Помилка «strict standards non-static method» в Textpattern
Так, що ж це така за помилка «non-static method» в Textpattern і як з нею справитись? Взагаліто в даному конкретному випадку з Textpattern 4.4.1 така помилка виникає із-за певних відмінностей (а їх таки вистачає, причому суттєвих) між PHP 5.3.x та PHP 5.4.x . Зокрема в PHP 5.4.4 E_ALL тепер включає помилки рівня E_STRICT в конфігураційній директиві error_reporting. А в текстпаттерні якраз і присутні кілька кодів, що генерують помилку рівня E_STRICT. Раніше ми її просто не помічали, а на версії PHP 5.4.4 вся адмінка текстпаттерна рясніє помилками «Strict Standards: Non-static method theme::init() ...» Виникає вона через те, що у файлах /textpattern/index.php та /textpattern/lib/txplib_misc.php деякі не статичні методи визиваються як статичні.. Зовні на роботу сайту це ніяк не впливає, усе ніби працює (якщо не працює — значить включений режим «тестування» або «відлагоджування»), от тільки в адмінці працювати неможливо.
Звісно розробники знайшли досить простий вихід з цієї ситуації, хоча сумніваюсь що він є досить хорошим (правильним). Проте яким би він не був — головне, що у Textpattern 4.4.1 це працює. А полягає він в простій фільтрації помилок E_STRICT в директиві error_reporting. Отож ближче до коду ;)
Перед редагуванням файлів — рекомендую зробити їх резервні копії. На всяк випадок :) Щоб позбутись помилок типу «strict standards non-static method» в Textpattern 4.4.1 необхідно виправити наступні два файли:
в файлі /textpattern/index.php шукаєм код:
error_reporting(E_ALL);
і заміняєм наступним кодом:
// We need to violate/disable E_STRICT for PHP 4.x compatibility
// E_STRICT bitmask calculation stems from the variations for E_ALL in PHP 4.x, 5.3, and 5.4
error_reporting(E_ALL & ~(defined('E_STRICT') ? E_STRICT : 0));
у файлі /textpattern/lib/txplib_misc.php шукаєм код:
error_reporting(E_ALL /* TODO: Enable E_STRICT in debug mode/PHP5.x? | (defined('E_STRICT') ? E_STRICT : 0) */);
і заміняєм на:
// We need to violate/disable E_STRICT for PHP 4.x compatibility
// E_STRICT bitmask calculation stems from the variations for E_ALL in PHP 4.x, 5.{0,1,2,3}, and 5.4+
// E_STRICT is defined since PHP 5.x and is set in E_ALL in PHP 5.4
error_reporting(E_ALL & ~(defined('E_STRICT') ? E_STRICT : 0));
шукаєм:
// default is 'testing': display everything except notices
error_reporting(E_ALL ^ (E_NOTICE));
заміняєм на:
// default is 'testing': display everything except notices and strict
error_reporting((E_ALL ^ E_NOTICE) & ~(defined('E_STRICT') ? E_STRICT : 0));
От і усе, зберігаємо зміни і юзаєм текстпаттерн на PHP5.4.4 Інформація щодо змін з сторінки релізів початкового коду r3679 Доречі, у бета версії Textpattern 4.5.0 цю проблему виправлено аналогічним методом.
Коментарі
Користувався версією Textpattern 4.4.1 після вимушеної зміни хостингу виникла аналогічна проблема…
Дякую за рекомендації, допомогло!
дякую! допомогло, не знав що PHP 5.4 в E_ALL включає помилки рівня E_STRICT
Коментарі