В настоящее время я пытаюсь обновить несколько наших сайтов, которые были на 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 уже есть дженерик, который не работает)