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 Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Описание: ну фигли оно не работает
DlTA
Отправлено: 16 Октября, 2012 - 21:51:13
Post Id



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


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


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




PHP Version 5.3.1
PHP:
скопировать код в буфер обмена
  1. class CSingleton {
  2.         static private $_item = null;
  3.         protected function __construct() {
  4.         }
  5.  
  6.         protected function __clone() {
  7.         }
  8.  
  9.         protected static function getClassName(){
  10.                 //echo __CLASS__;
  11.                 return __CLASS__;
  12.         }
  13.  
  14.         /**
  15.          * возвращает указатель на объект
  16.          *
  17.          */
  18.         static public function o() {
  19.                 if (self::$_item == null){
  20.                         $className = static::getClassName() ;
  21.                         //var_dump($className);
  22.                         self::$_item = new $className();
  23.                 }
  24.                 return self::$_item;
  25.         }
  26. }
  27.  
  28. class CTest extends CSingleton{
  29. }
  30.  
  31. var_dump(CTest::o());

а выдает object(CSingleton)[1]
вот какого лешего?????
 
 Top
Мелкий Супермодератор
Отправлено: 16 Октября, 2012 - 21:55:56
Post Id



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


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


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




Так работает __CLASS__

PS: по следам собственных граблей Подмигивание


-----
PostgreSQL DBA
 
 Top
DlTA
Отправлено: 16 Октября, 2012 - 21:57:18
Post Id



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


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


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




а как же быть?
по дурацки себя чувствуешь делая копипаст кода.

(Отредактировано автором: 16 Октября, 2012 - 21:57:46)

 
 Top
Мелкий Супермодератор
Отправлено: 16 Октября, 2012 - 21:59:43
Post Id



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


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


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




Хотел предложить get_class($this); (мне подошло как решение), потом заметил контекст static. Соответственно, промах.
(Добавление)
Во, нашёл: get_called_class()


-----
PostgreSQL DBA
 
 Top
armancho7777777 Супермодератор
Отправлено: 16 Октября, 2012 - 22:02:57
Post Id



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


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


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




Если правильно понял задачу, то может:
PHP:
скопировать код в буфер обмена
  1.  
  2. protected static function getClassName()
  3. {
  4.        return get_called_class();
  5. }
  6.  

(Добавление)
Мелкий пишет:

Во, нашёл: get_called_class()

Мелкий опередил Радость
 
 Top
DlTA
Отправлено: 16 Октября, 2012 - 22:07:33
Post Id



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


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


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




ааааааааааааааааааа круто работает. +
 
 Top
armancho7777777 Супермодератор
Отправлено: 16 Октября, 2012 - 22:12:16
Post Id



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


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


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




Если плюнуть на поддержку PHP 5.3, то можно trait - ы использовать.
Классная штука Подмигивание
 
 Top
DlTA
Отправлено: 16 Октября, 2012 - 22:14:49
Post Id



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


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


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




а это уже вроде 5,4?!
 
 Top
armancho7777777 Супермодератор
Отправлено: 16 Октября, 2012 - 22:18:38
Post Id



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


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


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




DlTA пишет:
а это уже вроде 5,4?!

Что ?
 
 Top
DlTA
Отправлено: 16 Октября, 2012 - 22:22:36
Post Id



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


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


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




в общем простая модификация с использованием функции get_called_class() дала свой результат но только со стороны кода, а вот тут стал вопрос удобности (IDE и автоподсказки)

пришлось все же делать небольшой копипаст, но гораздо меньше чем прежде

PHP:
скопировать код в буфер обмена
  1. class CSingleton {
  2. // ....
  3.  
  4. protected static function getClassName(){
  5.                 return get_called_class();
  6.         }
  7.  
  8.         /**
  9.          * возвращает указатель на объект
  10.          *
  11.          */
  12.         static protected function init() {
  13.                 if (self::$_item == null){
  14.                         $className = static::getClassName() ;
  15.                         //var_dump($className);
  16.                         self::$_item = new $className();
  17.                 }
  18.                 return self::$_item;
  19.         }
  20. }
  21. class CTest extends CSingleton{
  22.         /**
  23.          *
  24.          * @return CTest
  25.          */
  26.         public static function o(){
  27.                 return self::init();
  28.         }
  29.  
  30.         public function a(){
  31.  
  32.         }
  33. }

(Добавление)
armancho7777777 пишет:
Что ?


http://php.net/manual/ru/languag....oop5.traits.php
Цитата:
Начиная с версии 5.4.0 PHP вводит инструментарий для повторного использования кода, называемый трейтом.

(Отредактировано автором: 16 Октября, 2012 - 22:27:06)

 
 Top
OrmaJever Модератор
Отправлено: 16 Октября, 2012 - 22:26:33
Post Id



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


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


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




я как то раньше не знал о существовании метода get_called_class, и использовал имено познее статическое связывание ;)
PHP:
скопировать код в буфер обмена
  1. class A {
  2.         protected static $class = 'A';
  3.  
  4.         public static function getClassName() {
  5.                 return static::$class;
  6.         }
  7. }
  8.  
  9. class B extends A {
  10.         protected static $class = 'B';
  11. }
  12.  
  13. echo A::getClassName();
  14. echo B::getClassName();


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
DlTA
Отправлено: 16 Октября, 2012 - 22:28:43
Post Id



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


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


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




OrmaJever пишет:
  protected static $class = 'B';
вот и он, "копипаст"
 
 Top
armancho7777777 Супермодератор
Отправлено: 16 Октября, 2012 - 22:35:17
Post Id



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


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


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




DlTA пишет:
Начиная с версии 5.4.0 PHP вводит инструментарий для повторного использования кода, называемый трейтом.

Ну так я и написал Вам
armancho7777777 пишет:
Если плюнуть на поддержку PHP 5.3
 
 Top
OrmaJever Модератор
Отправлено: 16 Октября, 2012 - 22:36:40
Post Id



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


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


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




DlTA пишет:
вот и он, "копипаст"

на тот момент это было единственое здравое и работающее решение ;)


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
DlTA
Отправлено: 16 Октября, 2012 - 22:47:10
Post Id



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


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


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




OrmaJever пишет:
на тот момент это было единственое здравое и работающее решение ;)

оно кстати более короткое чем то что придумал я)

и к сожалению еще не все хостеры перешли с 5.2 (те к ноторых сайты изначально были на такой пыхе)
 
 Top
Страниц (4): [1] 2 3 4 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Объектно-ориентированное программирование »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB