переменная область переноса с php5/smarty2.6 на php7/smarty3.1

В настоящее время я пытаюсь обновить несколько наших сайтов, которые были на PHP5 и Smarty 2.6, до PHP7 и Smarty 3.1.31.

Ранее у нас был сайт с системой классов, расширяющей другие классы, вот ее упрощенная версия:

class Site extends WebView
{
    //functions
}

class WebView extends LandingPage
{
    //functions
}

class LandingPage extends Smarty
{
    function LandingPage()
    {
        $this->sessionInit = false;

        $this->flag = array();
        $this->engineVersion = '';

        $this->charset = 'utf-8';
        $this->content_type = 'text/html';
        $this->strings = array();
        $this->rtid=null;
    }
}

и раньше это работало нормально, поскольку все переменные были правильно размещены с использованием $this->variable_name. я могу получить к ним прямой доступ, используя $this, например $this->flag['TEST'], из внутренних классов, или извне я мог бы использовать $site, например $site->flag['TEST']. Однако теперь я получаю серию ошибок неопределенного свойства

Notice: Undefined property: Site::$sessionInit in /var/www/html/vendor/smarty/smarty/libs/Smarty.class.php on line 1447
Notice: Undefined property: Site::$flag in /var/www/html/vendor/smarty/smarty/libs/Smarty.class.php on line 1447
Notice: Undefined property: Site::$engineVersion in /var/www/html/vendor/smarty/smarty/libs/Smarty.class.php on line 1447
Notice: Undefined property: Site::$charset in /var/www/html/vendor/smarty/smarty/libs/Smarty.class.php on line 1447
Notice: Undefined property: Site::$content_type in /var/www/html/vendor/smarty/smarty/libs/Smarty.class.php on line 1447
Notice: Undefined property: Site::$strings in /var/www/html/vendor/smarty/smarty/libs/Smarty.class.php on line 1447
Notice: Undefined property: Site::$rtid in /var/www/html/vendor/smarty/smarty/libs/Smarty.class.php on line 1447

Я зашел в класс Smarty (очевидно, я этого не писал) и взял функцию для строки 1447, которая является универсальным сеттером:

/**
* <<magic>> Generic setter.
* Calls the appropriate setter function.
* Issues an E_USER_NOTICE if no valid setter is found.
*
* @param string $name  property name
* @param mixed  $value parameter passed to setter
*/
public function __set($name, $value)
{
    if (isset($this->accessMap[ $name ])) {
        $method = 'set' . $this->accessMap[ $name ];
        $this->{$method}($value);
    } elseif (in_array($name, $this->obsoleteProperties)) {
        return;
    } else {
        if (is_object($value) && method_exists($value, $name)) {
            $this->$name = $value;
        } else {
            trigger_error('Undefined property: ' . get_class($this) . '::$' . $name, E_USER_NOTICE);
        }
    }
}

он общий и используется везде, поэтому я предполагаю, что это нормально, и проблема в том, как я его называю. что меня заводит, так это то, как ошибки относятся к Site::$sessionInit, как если бы переменная должна была быть сайтом на сайте, и я злюсь, когда я пытаюсь установить ее на целевой странице.

Я знаю, что область видимости переменных в php7 изменилась, говорит ли это мне, что мне нужны сеттеры для всех моих переменных в классе сайта? мне нужно будет сделать по одному для каждой переменной или будет работать общий? (похоже, у smarty уже есть дженерик, который не работает)


person Josh    schedule 14.03.2017    source источник
comment
Как класс используется со Smarty? Какие функции вы вызываете из библиотеки Smarty и как?   -  person m13r    schedule 21.04.2017


Ответы (1)


Notice: Undefined property: Site::$sessionInit in /var/www/html/vendor ....
....
....

такая ошибка не означает, что переменные вызываются из-за пределов своих возможностей.

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

и чтобы решить эту проблему, вам просто нужно определить эти переменные следующим образом:

class LandingPage extends Smarty
{
    public $sessionInit;
    public $flag; // or what ever the right visibility term
    // .... and so on
    function LandingPage()
    {
        $this->sessionInit = false;

        $this->flag = array();
        $this->engineVersion = '';

        $this->charset = 'utf-8';
        $this->content_type = 'text/html';
        $this->strings = array();
        $this->rtid=null;
    }
}
person hassan    schedule 14.03.2017
comment
я попробую это. это просто функция php5, которая очень снисходительна и объявляет переменные от имени наших приложений, если она не нашла их раньше, тогда как php7 хочет, чтобы приложение было очень явным? - person Josh; 14.03.2017
comment
я так не думаю, вы можете скрыть это уведомление, установив для display_errors значение no в файле php.ini - person hassan; 14.03.2017