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 » » Объектно-ориентированное программирование » позднее статическое связывание

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

1. DlTA - 16 Октября, 2012 - 21:51:13 - перейти к сообщению
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]
вот какого лешего?????
2. Мелкий - 16 Октября, 2012 - 21:55:56 - перейти к сообщению
Так работает __CLASS__

PS: по следам собственных граблей Подмигивание
3. DlTA - 16 Октября, 2012 - 21:57:18 - перейти к сообщению
а как же быть?
по дурацки себя чувствуешь делая копипаст кода.
4. Мелкий - 16 Октября, 2012 - 21:59:43 - перейти к сообщению
Хотел предложить get_class($this); (мне подошло как решение), потом заметил контекст static. Соответственно, промах.
(Добавление)
Во, нашёл: get_called_class()
5. armancho7777777 - 16 Октября, 2012 - 22:02:57 - перейти к сообщению
Если правильно понял задачу, то может:
PHP:
скопировать код в буфер обмена
  1.  
  2. protected static function getClassName()
  3. {
  4.        return get_called_class();
  5. }
  6.  

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

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

Мелкий опередил Радость
6. DlTA - 16 Октября, 2012 - 22:07:33 - перейти к сообщению
ааааааааааааааааааа круто работает. +
7. armancho7777777 - 16 Октября, 2012 - 22:12:16 - перейти к сообщению
Если плюнуть на поддержку PHP 5.3, то можно trait - ы использовать.
Классная штука Подмигивание
8. DlTA - 16 Октября, 2012 - 22:14:49 - перейти к сообщению
а это уже вроде 5,4?!
9. armancho7777777 - 16 Октября, 2012 - 22:18:38 - перейти к сообщению
DlTA пишет:
а это уже вроде 5,4?!

Что ?
10. DlTA - 16 Октября, 2012 - 22:22:36 - перейти к сообщению
в общем простая модификация с использованием функции 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 вводит инструментарий для повторного использования кода, называемый трейтом.
11. OrmaJever - 16 Октября, 2012 - 22:26:33 - перейти к сообщению
я как то раньше не знал о существовании метода 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();
12. DlTA - 16 Октября, 2012 - 22:28:43 - перейти к сообщению
OrmaJever пишет:
  protected static $class = 'B';
вот и он, "копипаст"
13. armancho7777777 - 16 Октября, 2012 - 22:35:17 - перейти к сообщению
DlTA пишет:
Начиная с версии 5.4.0 PHP вводит инструментарий для повторного использования кода, называемый трейтом.

Ну так я и написал Вам
armancho7777777 пишет:
Если плюнуть на поддержку PHP 5.3
14. OrmaJever - 16 Октября, 2012 - 22:36:40 - перейти к сообщению
DlTA пишет:
вот и он, "копипаст"

на тот момент это было единственое здравое и работающее решение ;)
15. DlTA - 16 Октября, 2012 - 22:47:10 - перейти к сообщению
OrmaJever пишет:
на тот момент это было единственое здравое и работающее решение ;)

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

и к сожалению еще не все хостеры перешли с 5.2 (те к ноторых сайты изначально были на такой пыхе)

 

Powered by ExBB FM 1.0 RC1