За последние 24 часа нас посетили 15245 программистов и 1671 робот. Сейчас ищут 800 программистов ...

Обявление переменных в классе

Тема в разделе "PHP для новичков", создана пользователем wir_wolf, 5 ноя 2010.

  1. wir_wolf

    wir_wolf Активный пользователь

    С нами с:
    10 янв 2009
    Сообщения:
    183
    Симпатии:
    0
    Здравствуйте уважаемые форумчани. Пере до мной постала такая проблема.
    Ипшу ООП. Есть глобальный класс, в котом все основные настройки и функции.
    Так же есть функция Load которая подключает другие классы.
    Задача состоит в том чтобы при каждом подключаемом классе выделялась переменная типа object и туда запихивался класс который я инклюдю
    на данный момент у меня вот такая конструкция
    PHP:
    1. include_once('/libraries/'.$class.'.php');
    2. $this->class =&instantiate_class(new $class());
    3.  
    4. *******
    5.     function &instantiate_class(&$class_object)
    6. {
    7.     return $class_object;
    8. }
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ты хочешь создать новый класс исходя из того, что его имя хранится в переменной?
     
  3. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    тебе нужен синглтон
    PHP:
    1. <?php
    2. /**
    3.  * Singleton
    4.  * @author padaboo
    5.  * @link
    6.  * @abstract
    7.  */
    8. class Singleton {
    9.     /**
    10.     * Self
    11.     * @var self $instance
    12.     * @access protected
    13.     */
    14.     protected  static  $instance;
    15.     /**
    16.     * @access
    17.     * @static
    18.     * @return self
    19.     */
    20.     public static function getInstance(){
    21.         if (!self::$instance instanceof self) {
    22.                 self::$instance = new self();
    23.         }
    24.         return self::$instance;
    25.     }
    26. }
    27. ?>
    потом автолоад
    http://php.net/manual/en/language.oop5.autoload.html

    в синглтоне метод add и вызывать его в автолоаде

    UPD: кароче у меня так сделано
    PHP:
    1. <?php
    2. /**
    3.  * Description of registry
    4.  * @author padaboo
    5.  */
    6. abstract class ARegistry implements ArrayAccess {
    7.     /**
    8.     * Массив с классами
    9.     * @var array $vars
    10.     */
    11.    protected $vars = NULL;
    12.     /**
    13.      * @param string $key
    14.      * @param object $var
    15.      * @return void
    16.      */
    17.     abstract public function set($key, $var);
    18.     /*
    19.     * @var string $offset
    20.     * @return bool
    21.     */
    22.     public function offsetExists($offset){
    23.         return isset($this->vars[$offset]);
    24.     }
    25.     /*
    26.     * @var string $offset
    27.     * @return object
    28.     */
    29.     public function offsetGet($offset){
    30.         return $this->vars[$offset];
    31.     }
    32.     /*
    33.     * @var string $offset
    34.     * @var object $offset
    35.     * @return void
    36.     */
    37.     public function offsetSet($offset, $value) {
    38.         $this->set($offset, $value);
    39.     }
    40.     /*
    41.     * @var string $offset
    42.     * @return void
    43.     */
    44.     public function offsetUnset($offset) {
    45.         unset($this->vars[$offset]);
    46.     }
    47. }
    48. ?>
    PHP:
    1. <?php
    2. /**
    3.  * @author padaboo
    4.  * @link
    5.  */
    6. interface ISingleton {
    7.     /**
    8.      * Self
    9.      * @return self $instance
    10.      * @static
    11.      */
    12.     public static function getInstance();
    13. }?>
    PHP:
    1. <?php
    2. /**
    3.  * Trashcan Core
    4.  * @version 0.1
    5.  * @since none
    6.  * @author padaboo
    7.  * @link
    8.  * @final
    9.  */
    10. include_once '/../patterns/singleton/isingleton.php';
    11. include_once '/../patterns/registry/aregistry.php';
    12. final class Core extends ARegistry implements ISingleton {
    13.     /**
    14.     * Self
    15.     * @access private
    16.     * @staticvar self $instance
    17.     */
    18.     private static $instance;
    19.     /**
    20.     * @access public
    21.     * @return self
    22.     */
    23.     public static function getInstance(){
    24.         if (!self::$instance instanceof self) {
    25.                 self::$instance = new self();
    26.         }
    27.         return self::$instance;
    28.     }
    29.     /**
    30.      * Добавляет новое значение в массив
    31.      * @access public
    32.      * @param string $key
    33.      * @param object $var
    34.      * @return void
    35.      */
    36.     public function set($key, $var){
    37.         if (isset($this->vars[$key])){
    38.                 throw new Exception('Переменная`' . $key . 'уже задана ');
    39.         }
    40.         $this->vars[$key] = $var;
    41.     }
    42.      /**
    43.      * Загружает объекты массивом
    44.      * @access public
    45.      * @param array $vars
    46.      * @return void
    47.      */
    48.     public function setVars($vars){
    49.         if(is_array($this->vars)){
    50.             throw new Exception('Массив уже был загружен');
    51.         }
    52.         $this->vars = $vars;
    53.     }
    54.      /**
    55.      * Перенаправляет на другую
    56.      * страницу
    57.      * @access public
    58.      * @param string $url
    59.      * @return void
    60.      */
    61.     public function redirect($url){
    62.         header("Location: $url");
    63.         exit;
    64.     }
    65. }
    66. ?>
     
  4. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    PHP:
    1. <?php
    2. $c = Core::getInstance();
    3. $c['db']->query('');
    например
    вот только если в конструкторе какие то аргументы нужны хз
    только зачем это нужно?
     
  5. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
  6. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Padaboo
    Код настолько ценный, что аж копирайты поставил
     
  7. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    Apple
    копирайт нет бинс генерит из юзера компа, если класс в самом нет бинсе создавать
     
  8. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Apple
    :D
    Так его! Ишь, собственник в опен-сурс сообсчичестве завелся!
     
  9. wir_wolf

    wir_wolf Активный пользователь

    С нами с:
    10 янв 2009
    Сообщения:
    183
    Симпатии:
    0
    О майн гот. все не так сложно как кажется
    вот вся функция
    PHP:
    1. <?php   function load($props = array()){
    2.     /*Проверяем есть ли файл библиотек*/
    3.         if (count($props) > 1)
    4.         {
    5.             $list_files_libraries = $this->get_librari_file();
    6.             foreach ($props as $key => $val)
    7.             {
    8.                 if(in_array($val.'.php', $list_files_libraries)){
    9.                     include_once('/libraries/'.$val.'.php');
    10.                     //$this->init($val);
    11.                     $this->class =& instantiate_class(new $val());
    12.                     //$this->mod[]=$val;
    13.                 }
    14.                 else
    15.                 {
    16.                     //echo "Файл $val не найден, проверте писутствие файла 'libraries/$val.php'";
    17.                     //log_message('error', "Файл $val не найден, проверте писутствие файла 'libraries/$val.php'")
    18.                 }
    19.             }
    20.         }
    21.         else
    22.         {
    23.             $list_files_libraries = $this->get_librari_file();
    24.             if(in_array($props.'.php', $list_files_libraries)){
    25.                 include_once('/libraries/'.$props.'.php');
    26.                 $this->class =&instantiate_class(new $props());
    27.                 $this->mod[]=$props;
    28.             }
    29.             else
    30.             {
    31.                 echo "Файл $props не найден, проверте писутствие файла 'libraries/$props.php'";
    32.                 $GLOBALS->class["Log"]->log_message('error', "Файл $val не найден, проверте писутствие файла 'libraries/$val.php'");
    33.             }
    34.         }
    35.    
    36.     }?>
    а нужно сделать так
    PHP:
    1. <?php   function load($props = array()){
    2.     /*Проверяем есть ли файл библиотек*/
    3.         if (count($props) > 1)
    4.         {
    5.             $list_files_libraries = $this->get_librari_file();
    6.             foreach ($props as $key => $val)
    7.             {
    8.                 if(in_array($val.'.php', $list_files_libraries)){
    9.                     include_once('/libraries/'.$val.'.php');
    10.                     //$this->init($val);
    11.                     $this->class =& instantiate_class(new $val());
    12.                     //$this->mod[]=$val;
    13.                 }
    14.                 else
    15.                 {
    16.                     //echo "Файл $val не найден, проверте писутствие файла 'libraries/$val.php'";
    17.                     //log_message('error', "Файл $val не найден, проверте писутствие файла 'libraries/$val.php'")
    18.                 }
    19.             }
    20.         }
    21.         else
    22.         {
    23.             $list_files_libraries = $this->get_librari_file();
    24.             if(in_array($props.'.php', $list_files_libraries)){
    25.                 include_once('/libraries/'.$props.'.php');
    26.                 вот на этом этапе создать переменную и именем которое хранит в себе переменная props
    27.                 //$this->class =&instantiate_class(new $props());
    28. и что то типу $this->имя переменной которую мы создали =&instantiate_class(new $props());
    29.                 $this->mod[]=$props;
    30.             }
    31.             else
    32.             {
    33.                 echo "Файл $props не найден, проверте писутствие файла 'libraries/$props.php'";
    34.                 $GLOBALS->class["Log"]->log_message('error', "Файл $val не найден, проверте писутствие файла 'libraries/$val.php'");
    35.             }
    36.         }
    37.    
    38.     }?>
     
  10. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    wir_wolf
    я наверное схему буду делать для классов и путей , т.е. при создании класса в автолоаде мы получаем имя класса, оно будет ключем в массиве типа 'name' => 'path' если там нету такого, то рекурсивный поиск по папкам юзера
     
  11. wir_wolf

    wir_wolf Активный пользователь

    С нами с:
    10 янв 2009
    Сообщения:
    183
    Симпатии:
    0
    У меня уже были массивы, я от них ушел...
    Есть способ решить так как я описал?
     
  12. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    wir_wolf
    создай метод add
    и в нем
    PHP:
    1. public functin add($key, $val){
    2.     $this->class[$key] = $val;
    3. }
    тогда вот так будет
    PHP:
    1. <?php
    2. foreach ($props as $key => $val)
    3.              {
    4.                  if(in_array($val.'.php', $list_files_libraries)){
    5.                      include_once('/libraries/'.$val.'.php');
    6.                      $this->add( $val, & instantiate_class(new $val()));
    7.                  }
    8.                  else
    9.                  {
    10.                      //echo "Файл $val не найден, проверте писутствие файла 'libraries/$val.php'";
    11.                      //log_message('error', "Файл $val не найден, проверте писутствие файла 'libraries/$val.php'")
    12.                  }
    13.              }
     
  13. wir_wolf

    wir_wolf Активный пользователь

    С нами с:
    10 янв 2009
    Сообщения:
    183
    Симпатии:
    0
    перефразировал то что у меня сейчас есть, я хочу избавится на данном этопе от массивов а выходит что class это и есть массив
     
  14. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    wir_wolf
    ну он просто массив с объектами, без путей же... я хз как еше сделать, что бы все в одном месте было
     
  15. wir_wolf

    wir_wolf Активный пользователь

    С нами с:
    10 янв 2009
    Сообщения:
    183
    Симпатии:
    0
    Просто хочу чтобы каждый класс который я инклюдю был в отдельной переменной в глобальном классе
     
  16. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    А... магические методы
    http://php.net/manual/en/language.oop5.magic.html
    PHP:
    1. <?php
    2. /**
    3. * @author padaboo ^^
    4. * Копирование преследуется по закону
    5. * и карается смертью через тумба-юмба
    6. */
    7. class ThisIsFuckingMagic{
    8.     public function __get($name){
    9.         return $this->$name;
    10.     }
    11.     public function __set($name, $value){
    12.         $this->$name = $value;
    13.     }
    14. }
    15.  
    16. $dick = new ThisIsFuckingMagic();
    17. $var = 'ololo';
    18. $dick ->$var = ':D';
    19. echo $dick ->ololo;