Сложность программы растёт до тех пор,
пока не превысит способности программиста
(Законы Мерфи для программистов)
пока не превысит способности программиста
(Законы Мерфи для программистов)
Недавно ставил себе на локалку 1.10.7 и столкнулся с ошибками во время установки, о чём создал тему на форуме, где мне объяснили, что у меня наверняка установлена древняя версия PHP, а для Instant 1.10.7 требуется PHP от 5.3 до 7.0
Проверил. Действительно, с внезапамятных времён установлена сборка Денвера с PHP 5.2.12
Поставил Open Server — всё заработало. Даже не смотря на то, что там по умолчанию используется PHP 7.1
На этом можно было бы и закончить, но неугомонное любопытство заколебало вопросом: "Что там такое удивительное в PHP 5.3, чего нельзя было сделать с помощью PHP 5.2 12". Полез искать...
Первая проблема возникает при инсталляции сайта. Сразу:
Parse error: syntax error, unexpected T_STATIC in \core\classes\db.class.php on line 39
В указанном месте файла db.class.php строка:
$this->db_link = static::initConnection();
При создании класса cmsDatabase выполняется подключение базы данных.
В более ранних версиях instant это делалось непосредственно в private function __construct() :
$this->db_link = mysql_connect($inConf->db_host, $inConf->db_user, $inConf->db_pass) or die('Cannot connect to MySQL server');
Теперь для этого существует отдельная функция initConnection(), обращение к которой и вызывает ошибку.
Дело в том, что в PHP 5.3 был реализован механизм "позднего статического связывания" или LSB (Late Static Binding), который позволяет при вызове из одного класса, функции, расположенной в другом классе, установить связь с классом, из которого происходит вызов, а не с тем, где расположена функция!
Начитавшись про это здесь, я понял, что мне никогда не приходилось решать задачи хоть сколько-нибудь повышенной сложности, так как я даже придумать не могу ситуацию, в которой невозможно обойтись без "позднего связывания"!
А вот решение как обойти возникающую ошибку нашлось сразу:
$this->db_link = self::initConnection();
Инсталляция проходит без ошибок.
Осталось не приятное ощущение — не понятно для чего это было сделано? Что поменялось?
to be continue...
Реклама #
SpideR 4 года назад #
Abobo 4 года назад #