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 :: Версия для печати :: Ошибка при передаче класса в параметре метода
Форумы портала PHP.SU » » Объектно-ориентированное программирование » Ошибка при передаче класса в параметре метода

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

1. vlom - 21 Ноября, 2014 - 10:14:04 - перейти к сообщению
Суть проблемы в следущем
Есть приложение на Yii 1.1.2. В нем есть модель
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. class SiteSelector extends SelectorBase{
  3.         public $domain; // select Site by domain
  4.         public function __construct($cls = Site){
  5.                 parent::__construct($cls);
  6.         }
  7.         public function applyConditions(){
  8.                 $this->addIfNonEmpty("handle.handle", EqualCriterion, "domain");
  9.         }
  10. }

в методе __construct Site воспринимается как костанта.
На php 5.3.10 все работает отлично, на php 5.6.2 отказывается работать вызывая ошибку (ошибка на скриншоте в аттаче).
2. Мелкий - 21 Ноября, 2014 - 10:32:38 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1. const Site="siteconst";
  2. class SelectorBase {
  3. public function __construct($cls) {
  4. var_dump(__METHOD__, $cls);
  5. }
  6. }
  7. class SiteSelector extends SelectorBase{
  8.         public $domain; // select Site by domain
  9.         public function __construct($cls = Site){
  10.                 parent::__construct($cls);
  11.         }
  12.         public function applyConditions(){
  13.                 $this->addIfNonEmpty("handle.handle", EqualCriterion, "domain");
  14.         }
  15. }
  16.  
  17. new SiteSelector;


Цитата:
melkij@php-sandbox:~$ php -v
PHP 5.3.10 (cli) (built: Nov 21 2014 11:25:11)
Copyright (c) 1997-2012 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2012 Zend Technologies
melkij@php-sandbox:~$ php -f test.php
string(25) "SelectorBase::__construct"
string(9) "siteconst"
melkij@php-sandbox:~$ switch-phpfarm 5.6.2
Setting active PHP version to 5.6.2
PHP 5.6.2 (cli) (built: Nov 7 2014 10:49:55)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2014 Zend Technologies
melkij@php-sandbox:~$ php -f test.php
string(25) "SelectorBase::__construct"
string(9) "siteconst"

Версия PHP значения не имеет.

Уберём объявление константы:
Цитата:
melkij@php-sandbox:~$ switch-phpfarm 5.3.10
Setting active PHP version to 5.3.10
PHP 5.3.10 (cli) (built: Nov 21 2014 11:25:11)
Copyright (c) 1997-2012 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2012 Zend Technologies
melkij@php-sandbox:~$ php -f test.php
PHP Notice: Use of undefined constant Site - assumed 'Site' in /home/melkij/test.php on line 10

Notice: Use of undefined constant Site - assumed 'Site' in /home/melkij/test.php on line 10
string(25) "SelectorBase::__construct"
string(4) "Site"
melkij@php-sandbox:~$ switch-phpfarm 5.6.2
Setting active PHP version to 5.6.2
PHP 5.6.2 (cli) (built: Nov 7 2014 10:49:55)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2014 Zend Technologies
melkij@php-sandbox:~$ php -f test.php
PHP Notice: Use of undefined constant Site - assumed 'Site' in /home/melkij/test.php on line 10

Notice: Use of undefined constant Site - assumed 'Site' in /home/melkij/test.php on line 10
string(25) "SelectorBase::__construct"
string(4) "Site"

Вновь без изменений.

Итог: не там ищите. Проверяйте, где ваша константа и почему она больше не объявляется.
3. Bio man - 21 Ноября, 2014 - 11:21:48 - перейти к сообщению
Классы не передают, передают объекты. И да, ошибка к версии пхп отношения не имеет.
4. vlom - 21 Ноября, 2014 - 11:28:24 - перейти к сообщению
Мелкий пишет:
Итог: не там ищите. Проверяйте, где ваша константа и почему она больше не объявляется.

Возможно я немного не правильно объяснил. Если я правильно поял логику программиста который делал этот сайта то таким образом передается имя класса лежащего в той же папке с названием Site.php, данный файл существует.
Только что проделал следующую вещь. подключил файл Site.php явно перед объявлеием класса SelectorBase, далее возникла ошибка в подобном случае, заничт почему-то е работает автозагрузка классов
5. Bio man - 21 Ноября, 2014 - 12:06:19 - перейти к сообщению
А с чего работать автозагрузчику? пхп не понимает, что от него хотят, и думает, что это константа.

PHP:
скопировать код в буфер обмена
  1. class SiteSelector extends SelectorBase{
  2.         public $domain; // select Site by domain
  3.         public function __construct(Site $cls){
  4.                 parent::__construct($cls);
  5.         }
  6.         public function applyConditions(){
  7.                 $this->addIfNonEmpty("handle.handle", EqualCriterion, "domain");
  8.         }
  9. }

Так мы указываем, какого типа переменная, по умолчанию можно присвоить только скалярное значение
6. vlom - 21 Ноября, 2014 - 12:23:30 - перейти к сообщению
Bio man пишет:
А с чего работать автозагрузчику?

Дак суть в том что на рабочем сервере с 5.3 все работатет
На локальном с 5,6 не запускается
7. Sail - 21 Ноября, 2014 - 12:32:22 - перейти к сообщению
vlom пишет:
Bio man пишет:
А с чего работать автозагрузчику?

Дак суть в том что на рабочем сервере с 5.3 все работатет
На локальном с 5,6 не запускается

Так обрамите Site кавычками... Пусть будет не неопределённая константа, а строка, представляющая собой имя класса.
Показали-б сразу конструктор родителя, было-б понятно...
8. MiksIr - 21 Ноября, 2014 - 12:50:03 - перейти к сообщению
vlom пишет:
Дак суть в том что на рабочем сервере с 5.3 все работатет
На локальном с 5,6 не запускается

Суть в том, что у вас ошибка, что для 5.3, что для 5.6. Причины "работает" - "не работают" - это уже второе, не влияющее на наличие ошибки.
Исправьте ее
9. Bio man - 21 Ноября, 2014 - 14:09:59 - перейти к сообщению
vlom пишет:
Дак суть в том что на рабочем сервере с 5.3 все работатет
На локальном с 5,6 не запускается

Включи все ошибки и увидишь, что не работает.
А то что "работает" это лишь иллюзия, на самом деле тут огромная дырка в архитектуре.
Что на 5.3 что на 5.6 поведение одинаковое, если передать несуществующую константу, то будет выброшен Notice а переменная примет имя константы.
Так что единственный путь это исправить ошибки, ну или, если тебе пофиг, что приложение будет работать неправильно, то просто заглуши ошибки.
10. Dastor - 21 Ноября, 2014 - 14:35:55 - перейти к сообщению
vlom пишет:
Дак суть в том что на рабочем сервере с 5.3 все работатет
На локальном с 5,6 не запускается


У Вас разный error_reporting видимо. Поэтому на одном сервер видите ошибку, а на другом нет.
11. Мелкий - 21 Ноября, 2014 - 14:38:24 - перейти к сообщению
Господа, хочу ещё раз обратить внимание: ошибку ловит Yii. Т.е., это set_error_handler, который ловит все ошибки вне зависимости от error_reporting.

Поэтому, если код идентичен, то в окружении 5.3 эта константа действительно существует.
Следовательно, в первую очередь проверять идентичность кода и всех файлов проекта. Наиболее вероятно, что они различаются.
Если файлы идентичны и все на своих местах - то ищите, где константа объявляться должна и, самое важное, когда. Возможен банально неверный порядок загрузки, например, полагающийся на readdir.
(Добавление)
vlom пишет:
почему-то е работает автозагрузка классов

Константы (не константы классов, у вас именно обычная глобальная константа) не имеют никакого отношения к автозагрузке классов.
12. MiksIr - 21 Ноября, 2014 - 15:03:45 - перейти к сообщению
Мелкий в Yii1
set_error_handler(array($this,'handleError'),error_reporting());
т.е. уровень ошибок как раз рассматривается.

Сообщение об ошибке на скриншоте тоже не Yii-шное.
13. Мелкий - 21 Ноября, 2014 - 15:25:01 - перейти к сообщению
MiksIr пишет:
set_error_handler(array($this,'handleError'),error_reporting());
т.е. уровень ошибок как раз рассматривается.

Честно говоря, с удивлением узнал о существовании второго параметра Закатив глазки
Значит сначала проверять error_reporting. Если на 5.3 E_NOTICE был выключен, то это и будет причиной.
14. Sail - 21 Ноября, 2014 - 15:27:52 - перейти к сообщению

Огорчение
Спойлер (Отобразить)
15. Мелкий - 21 Ноября, 2014 - 15:31:34 - перейти к сообщению

Sail, неправильно мысль выразил, ага. Пока вспоминал, как же это по-русски говорится...

 

Powered by ExBB FM 1.0 RC1