Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Unexpected T_PAAMAYIM_NEKUDOTAYIM на php 5.2.17
Форумы портала PHP.SU » » Если скрипт не работает » Unexpected T_PAAMAYIM_NEKUDOTAYIM на php 5.2.17

Страниц (2): [1] 2 »
 

1. Xts - 19 Февраля, 2015 - 11:38:58 - перейти к сообщению
Привет всем.
при переносе с локалки (php 5.3) на хостинг (php 5.2)
вылезла эта ошибка
Цитата:
Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM

знаю что связана она с ::, но как исправить не знаю.
вот строка на которую ругается
PHP:
скопировать код в буфер обмена
  1. array_push($this->modules, new ModuleInfo($name, $name::getUrl()));

вот функция целиком
PHP:
скопировать код в буфер обмена
  1. public function registerModule($name)
  2.         {
  3.             array_push($this->modules, new ModuleInfo($name, $name::getUrl()));
  4.             $this->log->debug("Registering module $name");
  5.         }

пробовал делать так

тогда ошибки нет, но ничего не работает, цепляется только один модуль, стоящий первый в списке.
Тогда я сделал так на серве с php 5.3
PHP:
скопировать код в буфер обмена
  1. ModuleInfo::getUrl()

и получил вот такие ошибки
Цитата:
Notice: Undefined property: ModuleManager::$url in /www/classes/ModuleInfo.php on line 20

вот что на 20 строке этого файла
PHP:
скопировать код в буфер обмена
  1. return $this->url;

а именно вызываемая функция
PHP:
скопировать код в буфер обмена
  1. public function getUrl()
  2.                 {
  3.                         return $this->url;
  4.                 }
2. Sail - 19 Февраля, 2015 - 11:57:05 - перейти к сообщению
Xts пишет:
при переносе с локалки (php 5.3) на хостинг (php 5.2)
...
знаю что связана она с ::, но как исправить не знаю.

Всё просто: Оператор разрешения области видимости ( :: )
Цитата:
Начиная с версии PHP 5.3.0, стало возможным обратиться к классу с помощью переменной. Значение переменной не должно быть ключевым словом (например, self, parent или static).

(Добавление)
Насчёт "исправить" (там-же, речь о статических методах, константах....):
Цитата:
При обращении к этим элементам извне класса, необходимо использовать имя этого класса

(Добавление)
Ну, или хостинг по-современнее найти... Улыбка
3. Xts - 19 Февраля, 2015 - 12:02:02 - перейти к сообщению
Sail
в чем причина то я знаю, что в 5.3 добавили это.
дак а как под 5.2 то заставить работать? вот это я чет не могу
(Добавление)
да и я же написал, что если заменить переменную на имя класса, то ошибки нет, но и не работает ничего нормально
4. Sail - 19 Февраля, 2015 - 12:09:36 - перейти к сообщению
Xts, смотрю на описание функции: public function getUrl(), и не понимаю, для чего используете оператор :: ?
Попробуйте просто
5. Xts - 19 Февраля, 2015 - 12:14:36 - перейти к сообщению
Sail пишет:
Xts, смотрю на описание функции: public function getUrl(), и не понимаю, для чего используете оператор :: ?
Попробуйте просто

если сделать так, то вот что получаем
Fatal error: Call to a member function getUrl() on a non-object in /www/classes/ModuleManager.php on line 17

хороший вопрос, не я это писал
6. Sail - 19 Февраля, 2015 - 12:23:44 - перейти к сообщению
Xts, а в функцию registerModule() передаётся просто строка, представляющая собой название класса? Улыбка
7. Xts - 19 Февраля, 2015 - 12:25:53 - перейти к сообщению
Sail
туда передаются названия классов модулей

PHP:
скопировать код в буфер обмена
  1. $moduleManager = new ModuleManager();
  2.  
  3.         $moduleManager->registerModule('Admin');
  4.         $moduleManager->registerModule('MainPage');
  5.         $moduleManager->registerModule('Pages');
  6.         $moduleManager->registerModule('Feedback');
  7.         $moduleManager->registerModule('News');
8. Sail - 19 Февраля, 2015 - 12:34:22 - перейти к сообщению
Xts, в базовом классе, от которых наследуются перечисленные при регистрации модули, есть функция getUrl()? (ну или в самих этих классах)
И объявлена ли она статической?
9. Xts - 19 Февраля, 2015 - 12:40:39 - перейти к сообщению
Sail, она объявлена статической в каждом модуле и вот еще такой кусок есть

PHP:
скопировать код в буфер обмена
  1.         interface Module
  2.         {
  3.                 public function exec($url);
  4.                 public function getTemplateName();
  5.                 static public function getUrl();
  6.         }
10. Sail - 19 Февраля, 2015 - 13:32:37 - перейти к сообщению
Xts пишет:
Sail, она объявлена статической в каждом модуле и вот еще такой кусок есть

PHP:
скопировать код в буфер обмена
  1.         interface Module
  2.         {
  3.                 public function exec($url);
  4.                 public function getTemplateName();
  5.                 static public function getUrl();
  6.         }

"Такой кусок" - это интерфейс, который должен быть реализован в тех самых классах.
"Объявлена статической в каждом модуле" - тогда логично.
Но (всё в той-же справке):
PHP:
скопировать код в буфер обмена
  1. $classname = 'MyClass';
  2. echo $classname::CONST_VALUE; // Начиная с версии PHP 5.3.0

Следовательно, нужно как-то иначе определять второй параметр для конструктора ModuleInfo....
11. Xts - 19 Февраля, 2015 - 13:34:51 - перейти к сообщению
Sail пишет:
"Такой кусок" - это интерфейс, который должен быть реализован в тех самых классах.

знаю что интерфейс

Sail пишет:
Следовательно, нужно как-то иначе определять второй параметр для конструктора ModuleInfo....

знать бы как Меланхолия
12. Sail - 19 Февраля, 2015 - 13:36:48 - перейти к сообщению
Кстати, вот:
PHP:
скопировать код в буфер обмена
  1. Ура! Есть решение и для PHP 5.2!
  2.  
  3. $addition = calc_user_func($className . '::staticF');
13. Xts - 19 Февраля, 2015 - 13:41:12 - перейти к сообщению
Sail, пробовал подобное городить, но чет не понимаю как его туда всунуть правильно
14. Sail - 19 Февраля, 2015 - 13:44:19 - перейти к сообщению
Xts,
PHP:
скопировать код в буфер обмена
  1. array_push($this->modules, new ModuleInfo($name, $name::getUrl()));
  2. /* превращается в: */
  3. array_push($this->modules, new ModuleInfo($name, call_user_func($name . '::getUrl')));
  4.  
15. Xts - 19 Февраля, 2015 - 13:49:47 - перейти к сообщению
Sail пишет:
Xts,
PHP:
скопировать код в буфер обмена
  1. array_push($this->modules, new ModuleInfo($name, $name::getUrl()));
  2. /* превращается в: */
  3. array_push($this->modules, new ModuleInfo($name, call_user_func($name . '::getUrl')));
  4.  

оу, понял в чем косяк, спасибо

и да, поправьте название функции, не calc_user_func, а call_user_func

 

Powered by ExBB FM 1.0 RC1