Помилка «strict standards non-static method» в Textpattern

strict standards non-static methodТак, що ж це така за помилка «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 цю проблему виправлено аналогічним методом.

Можливо вас зацікавлять подібні статті:

Коментарі

  • Avatar textmaster

    Користувався версією Textpattern 4.4.1 після вимушеної зміни хостингу виникла аналогічна проблема…
    Дякую за рекомендації, допомогло!

  • Avatar savio

    дякую! допомогло, не знав що PHP 5.4 в E_ALL включає помилки рівня E_STRICT

Коментарі

Поля позначені як * потрібні обов’язково. Перед постінгом завжди робіть перегляд свого коментаря.