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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Ошибка при передаче класса в параметре метода

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
vlom
Отправлено: 21 Ноября, 2014 - 10:14:04
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 681
Дата рег-ции: Окт. 2010  
Откуда: Екатеринбург


Помог: 4 раз(а)




Суть проблемы в следущем
Есть приложение на 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 отказывается работать вызывая ошибку (ошибка на скриншоте в аттаче).
Прикреплено изображение (Нажмите для увеличения)
Снимок экрана от 2014-11-21 13:13:22.png
 
 Top
Мелкий Супермодератор
Отправлено: 21 Ноября, 2014 - 10:32:38
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




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"

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

Итог: не там ищите. Проверяйте, где ваша константа и почему она больше не объявляется.


-----
PostgreSQL DBA
 
 Top
Bio man
Отправлено: 21 Ноября, 2014 - 11:21:48
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2751
Дата рег-ции: Июль 2010  
Откуда: Даугавпилс, Латвия


Помог: 52 раз(а)




Классы не передают, передают объекты. И да, ошибка к версии пхп отношения не имеет.
 
 Top
vlom
Отправлено: 21 Ноября, 2014 - 11:28:24
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 681
Дата рег-ции: Окт. 2010  
Откуда: Екатеринбург


Помог: 4 раз(а)




Мелкий пишет:
Итог: не там ищите. Проверяйте, где ваша константа и почему она больше не объявляется.

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


Постоянный участник


Покинул форум
Сообщений всего: 2751
Дата рег-ции: Июль 2010  
Откуда: Даугавпилс, Латвия


Помог: 52 раз(а)




А с чего работать автозагрузчику? пхп не понимает, что от него хотят, и думает, что это константа.

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. }

Так мы указываем, какого типа переменная, по умолчанию можно присвоить только скалярное значение
 
 Top
vlom
Отправлено: 21 Ноября, 2014 - 12:23:30
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 681
Дата рег-ции: Окт. 2010  
Откуда: Екатеринбург


Помог: 4 раз(а)




Bio man пишет:
А с чего работать автозагрузчику?

Дак суть в том что на рабочем сервере с 5.3 все работатет
На локальном с 5,6 не запускается
 
 Top
Sail
Отправлено: 21 Ноября, 2014 - 12:32:22
Post Id



Участник


Покинул форум
Сообщений всего: 1131
Дата рег-ции: Февр. 2014  


Помог: 57 раз(а)




vlom пишет:
Bio man пишет:
А с чего работать автозагрузчику?

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

Так обрамите Site кавычками... Пусть будет не неопределённая константа, а строка, представляющая собой имя класса.
Показали-б сразу конструктор родителя, было-б понятно...
 
 Top
MiksIr
Отправлено: 21 Ноября, 2014 - 12:50:03
Post Id


Забанен


Покинул форум
Сообщений всего: 378
Дата рег-ции: Сент. 2014  


Помог: 10 раз(а)

[+]


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

Суть в том, что у вас ошибка, что для 5.3, что для 5.6. Причины "работает" - "не работают" - это уже второе, не влияющее на наличие ошибки.
Исправьте ее

(Отредактировано автором: 21 Ноября, 2014 - 12:51:02)



-----
self-banned
 
 Top
Bio man
Отправлено: 21 Ноября, 2014 - 14:09:59
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2751
Дата рег-ции: Июль 2010  
Откуда: Даугавпилс, Латвия


Помог: 52 раз(а)




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

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


Гость


Покинул форум
Сообщений всего: 66
Дата рег-ции: Окт. 2014  


Помог: 3 раз(а)




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


У Вас разный error_reporting видимо. Поэтому на одном сервер видите ошибку, а на другом нет.
 
 Top
Мелкий Супермодератор
Отправлено: 21 Ноября, 2014 - 14:38:24
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Господа, хочу ещё раз обратить внимание: ошибку ловит Yii. Т.е., это set_error_handler, который ловит все ошибки вне зависимости от error_reporting.

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

Константы (не константы классов, у вас именно обычная глобальная константа) не имеют никакого отношения к автозагрузке классов.


-----
PostgreSQL DBA
 
 Top
MiksIr
Отправлено: 21 Ноября, 2014 - 15:03:45
Post Id


Забанен


Покинул форум
Сообщений всего: 378
Дата рег-ции: Сент. 2014  


Помог: 10 раз(а)

[+]


Мелкий в Yii1
set_error_handler(array($this,'handleError'),error_reporting());
т.е. уровень ошибок как раз рассматривается.

Сообщение об ошибке на скриншоте тоже не Yii-шное.


-----
self-banned
 
 Top
Мелкий Супермодератор
Отправлено: 21 Ноября, 2014 - 15:25:01
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




MiksIr пишет:
set_error_handler(array($this,'handleError'),error_reporting());
т.е. уровень ошибок как раз рассматривается.

Честно говоря, с удивлением узнал о существовании второго параметра Закатив глазки
Значит сначала проверять error_reporting. Если на 5.3 E_NOTICE был выключен, то это и будет причиной.


-----
PostgreSQL DBA
 
 Top
Sail
Отправлено: 21 Ноября, 2014 - 15:27:52
Post Id



Участник


Покинул форум
Сообщений всего: 1131
Дата рег-ции: Февр. 2014  


Помог: 57 раз(а)





Огорчение
Спойлер (Отобразить)
 
 Top
Мелкий Супермодератор
Отправлено: 21 Ноября, 2014 - 15:31:34
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)





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


-----
PostgreSQL DBA
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Объектно-ориентированное программирование »


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



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB