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 »   

> Описание: Хитрая манипуляция с классами - помогите!
M-K
Отправлено: 11 Сентября, 2012 - 21:39:04
Post Id


Новичок


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


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




Вот код. Первая функция работает, вторая нет. Я хотел бы во второй вывести все объекты из классов, которые создал скрипт. Как это можно правильно сделать?

PHP:
скопировать код в буфер обмена
  1. class classes{
  2. // ...
  3.         function get_classes(){
  4.                 $declared_classes = get_declared_classes();            
  5.                 $class_classes_id = array_search("classes",$declared_classes);
  6.                 foreach($declared_classes as $k => $v){
  7.                         if($k>$class_classes_id){
  8.                                 $cms_declared_classes[] = $v;
  9.                         }
  10.                 }
  11.                 return $cms_declared_classes;
  12.         }
  13.  
  14.         function get_objects(){
  15.                 $declared_classes = get_declared_classes();            
  16.                 $class_classes_id = array_search("classes",$declared_classes);
  17.                 foreach($declared_classes as $k => $v){
  18.                         if($k>$class_classes_id){
  19.                                 $cms_declared_classes[] = $v;
  20.                         }
  21.                 }
  22.                 foreach($cms_declared_classes as $k => $v){
  23.                         if((object)$$v instanceof $v){
  24.                                 $cms_objects[] = $v;
  25.                         }
  26.                 }
  27.                 return $cms_objects;
  28.         }
  29. }
  30. $cms = new classes("vars,db,debug,files","vars,db,debug");
  31. echo "классы:";
  32. dump($cms->get_classes());
  33. echo "объекты:";
  34. dump($cms->get_objects());
  35.  
 
 Top
OrmaJever Модератор
Отправлено: 11 Сентября, 2012 - 21:46:57
Post Id



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


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


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




Обьект это обычная переменая, нет такой функции которая возвращал бы список переменых в отличии от класов. У меня есть такой вариант пройти масив $GLOBALS в цикле и проверять тип переменой на принадлежность к даному класу.
(Добавление)
Заинтересовала меня эта тема, поэтому решил сам попробовать. Вот вобщем пример
PHP:
скопировать код в буфер обмена
  1. class A {}
  2.  
  3. $a1 = new A();
  4. $a2 = 'str';
  5. $s4 = 5;
  6. $as = new A();
  7.  
  8. $obj = array();
  9. $class = 'A';
  10.  
  11. foreach($GLOBALS as $k => $v) {
  12.         if($v instanceof $class) $obj[$k] = $v;
  13. }
  14. print_r($obj);


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
M-K
Отправлено: 11 Сентября, 2012 - 22:18:53
Post Id


Новичок


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


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




МИНУТОЧКУ!!! Все должно работать через методы некого хитрого класса классов, который у меня назван "classes".

Я научился уже получать список объявленых классов (данные предоставляет метод класса).
Теперь хотел бы точно так же через метод класса получать список всех объектов всех классов, тех, что создал я, а не какие-то встроенные в PHP до меня.

P.S. Можно хотя бы заставить работать функцию get_defined_vars() внутри метода класса? Даже "global $GLOBALS" не помогает, хотя это смешно звучит.
 
 Top
OrmaJever Модератор
Отправлено: 11 Сентября, 2012 - 22:23:56
Post Id



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


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


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




M-K пишет:
Теперь хотел бы точно так же через метод класса получать список всех объектов всех классов, тех, что создал я, а не какие-то встроенные в PHP до меня.

В чём проблема? тот код что я написал вставить в ваш метод и посмотреть результат. И что значит встроеные до вас? Когда запускается скрипт то не существует ни одной переменой кроме глобальной т.е. и обьектов не существует.
Ах да, если вам нужно взять все обьект, а не только принадлежащие определёному класу то можно проверять их функцией is_object()


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
M-K
Отправлено: 11 Сентября, 2012 - 23:01:17
Post Id


Новичок


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


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




Спасибо, что напомнили про эту функцию.
В общем, вот решение:
function get_objects(){
$classes = $this->get_classes();
foreach($classes as $k => $v){
if(is_object($GLOBALS[$v])){
$objects[] = $GLOBALS[$v];
}
}
return $objects;
}
 
 Top
caballero
Отправлено: 11 Сентября, 2012 - 23:11:31
Post Id


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


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


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




Цитата:
Теперь хотел бы точно так же через метод класса получать список всех объектов всех классов, тех, что создал я, а не какие-то встроенные в PHP до меня.

Даже не представляю какой в этом смысл


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
M-K
Отправлено: 11 Сентября, 2012 - 23:21:35
Post Id


Новичок


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


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




Ну объясняю логику тогда. Предположим сразу, что вариант "прочитать код и все увидеть своими глазами" не годится. Поэтому будем выводить данные по запросу программиста. Часть классов он просто подключает через класс classes (один из главных классов системы). А часть он даже... а из их части он создает объекты (не он, а класс classes по его команде). И вот первая функция выводит классы какие он имеет возможность использовать для создания объектов. А вторая - выводит список объектов, которые были созданы через список классов, который он подал конструкторскому методу класса classes. Зачем все это? Для того чтобы не писать 100 раз "%samename%". new ."%samename%", ну вы поняли.
(Добавление)
Ну а вот на десерт, вывод всех возможностей класса! Очень наглядно. Только это старая версия, построеная на философии echo нежели return Хорошо
PHP:
скопировать код в буфер обмена
  1.      function dump_class(){
  2.           echo "Class \"".(get_class($this))."\".<br />";
  3.           $class_vars = get_class_vars(get_class($this));
  4.           $class_methods = get_class_methods(get_class($this));
  5.           if(empty($class_vars)) echo " Class has not variables. ";
  6.           if(empty($class_methods)) echo " Class has not methods. ";
  7.           if(!empty($class_vars)){
  8.                echo "Variables:<pre>";
  9.                print_r($class_vars);
  10.                echo "</pre>";
  11.           }
  12.           if(!empty($class_methods)){
  13.                echo "Methods:<pre>";
  14.                print_r($class_methods);
  15.                echo "</pre>";
  16.           }
  17.      }
 
 Top
OrmaJever Модератор
Отправлено: 11 Сентября, 2012 - 23:41:09
Post Id



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


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


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




caballero пишет:
Даже не представляю какой в этом смысл

Смысл есть, например какойнибудь оптимизатор или просто логер для php скрипта.


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
digi
Отправлено: 12 Сентября, 2012 - 00:26:57
Post Id


Посетитель


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


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




OrmaJever пишет:
Смысл есть, например какойнибудь оптимизатор или просто логер для php скрипта.

можно по подробнее? Улыбка какой именно оптимизатор или логгер? ;)
 
 Top
OrmaJever Модератор
Отправлено: 12 Сентября, 2012 - 00:40:05
Post Id



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


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


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




Ну к примеру зделать функцию которая исчет два или более обьектов одного класса и если находит то выводит например свой рукописный нотис, и если скрипт пишут несколько человек то когда случайно кто-то создаст лишнюю копию обьекта то он увидит нотис в котором будет имя переменой с уже созданым обьектом и он сможет подправить скрипт. Это что качается оптимизатора, а теперь про логер.

Я часто сталкивался с тем что работа популярных цмс слишком медленая и затратная поэтому пишем функцию которая запишет в файл все переменые их размер и возможно повторяющиеся значения и прочее что может понадобится для оптимизации, ну и вызываем эту функции снова в конце файла. Здесь информация об обьектах это только часть идеи но она тоже имеет место быть для более полной картины происходящего.

PS. это всё просто идеи для улушения жизни, они могут быть бесмыслеными, а могут и принести пользу и сэкономить кучу времени.


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
caballero
Отправлено: 12 Сентября, 2012 - 00:56:07
Post Id


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


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


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




Цитата:
Предположим сразу, что вариант "прочитать код и все увидеть своими глазами" не годится. Поэтому будем выводить данные по запросу программиста. Часть классов он просто подключает через класс classes (один из главных классов системы). А часть он даже... а из их части он создает объекты (не он, а класс classes по его команде). И вот первая функция выводит классы какие он имеет возможность использовать для создания объектов. А вторая - выводит список объектов, которые были созданы через список классов, который он подал конструкторскому методу класса classes. Зачем все это? Для того чтобы не писать 100 раз "%samename%". new ."%samename%", ну вы поняли

Полная чушь. Вы даже не понимаете разницу между редактированием программы и ее выполнением.
(Добавление)
Цитата:
Ну к примеру зделать функцию которая исчет два или более обьектов одного класса и если находит то выводит например свой рукописный нотис,

А ничего что создание нескольких екземпляров класса- это в порядке вещей. Даже если это один и тот же екземпляр - в 99.9% случаев это будет екземпляры в другом месте и в другое время.

А что качсается оптимизации то профилировщик и так покажет какая функция сколько времени выполняется и сколько раз вызывается


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
M-K
Отправлено: 12 Сентября, 2012 - 13:52:47
Post Id


Новичок


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


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




caballero пишет:
"%samename%". new ."%samename%"

Скорее всего это вы не поняли вот это. Точнее вы поняли это буквально. А я говорил в образном смысле ;) И как раз это вас и смутила, потому вы назвали это чушью.

caballero пишет:
А ничего что создание нескольких екземпляров класса- это в порядке вещей. Даже если это один и тот же екземпляр - в 99.9% случаев это будет екземпляры в другом месте и в другое время.

Конечно ничего. Там же нету запрета еще раз создать экземпляр. Вот полный исходник класса загрузки классов. Прошу критикуйте. Может вы и правы.

PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. define(DIR, "/classes");
  3. define(RUN_ALL, "all");
  4. class classes{
  5.         function __construct($classesToLoad=false,
  6.                                                                          $classesToRun=false,
  7.                                                                          $isSubclass=false){
  8.                 if($classesToLoad){
  9.                         $this->loadClasses($classesToLoad);
  10.                 }
  11.                 if($classesToRun){
  12.                         $this->runClasses($classesToLoad,$classesToRun,$isSubclass);
  13.                 }
  14.         }
  15.  
  16.         function loadClasses($classesToLoad){
  17.                 if($classesToLoad==RUN_ALL){
  18.                         $d = dir(DIR);
  19.                         while(false !== ($file = $d->read())){
  20.                                 if(($file!=".") && ($file!="..") && (strpos("class.".$file, ".php"))){
  21.                                         include_once("classes/class.".$file);
  22.                                 }
  23.                         }
  24.                         $d->close();
  25.                 }else{
  26.                         $classesToLoad = explode(",", $classesToLoad);
  27.                         foreach($classesToLoad as $classToLoad){
  28.                                 $classToLoad = trim($classToLoad);
  29.                                 include_once("classes/class.".$classToLoad.".php");
  30.                         }
  31.                 }
  32.         }
  33.        
  34.         function runClasses($classesToLoad,$classesToRun=false,$isSubclass){
  35.                 if($classesToRun==RUN_ALL){
  36.                         $classesToLoad = explode(",", $classesToLoad);
  37.                         foreach($classesToLoad as $classToRun){
  38.                                 $classToRun = trim($classToRun);
  39.                                 if(in_array($classToRun,get_declared_classes())){
  40.                                         if($isSubclass){
  41.                                                 $this->$classToRun = new $classToRun();
  42.                                         }else{
  43.                                                 $GLOBALS[$classToRun] = new $classToRun();
  44.                                         }
  45.                                 }
  46.                         }
  47.                 }else{
  48.                         $classesToRun = explode(",", $classesToRun);
  49.                         foreach($classesToRun as $classToRun){
  50.                                 $classToRun = trim($classToRun);
  51.                                 if(in_array($classToRun,get_declared_classes())){
  52.                                         if($isSubclass){
  53.                                                 $this->$classToRun = new $classToRun();
  54.                                         }else{
  55.                                                 $GLOBALS[$classToRun] = new $classToRun();
  56.                                         }
  57.                                 }
  58.                         }
  59.                 }
  60.         }
  61.  
  62.         function get_classes(){
  63.                 $declared_classes = get_declared_classes();            
  64.                 $class_classes_id = array_search("classes",$declared_classes);
  65.                 foreach($declared_classes as $k => $v){
  66.                         if($k>$class_classes_id){
  67.                                 $cms_declared_classes[] = $v;
  68.                         }
  69.                 }
  70.                 return $cms_declared_classes;
  71.         }
  72.  
  73.         function get_objects(){
  74.                 $classes = $this->get_classes();
  75.                 foreach($classes as $k => $v){
  76.                         if(is_object($GLOBALS[$v])){
  77.                                 $objects[] = $GLOBALS[$v];
  78.                         }
  79.                 }
  80.                 return $objects;
  81.         }
  82.  
  83. }
  84. ?>
 
 Top
caballero
Отправлено: 12 Сентября, 2012 - 14:42:04
Post Id


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


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


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




Цитата:
А я говорил в образном смысле

Это програмирование а не литература.
В любом случае это чушь просто потому чет в этом нет практиеского смысла.

Цитата:
Конечно ничего. Там же нету запрета еще раз создать экземпляр. Вот полный исходник класса загрузки классов. Прошу критикуйте. Может вы и правы.

Просто подумайте - какой ПРАКТИЧЕСКИЙ смысл в получении списка объектов классов или списка классов.
Человек пишущий код и так знает какие там объекты и классы иначе он говнокодер и никакие хитрые классы ему не помогут.
А их список во время выполения не дает абсолютно никакой полезной информации. Во всяком случае не больше чем дает любой профайлер или дебагер.


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
M-K
Отправлено: 12 Сентября, 2012 - 17:45:14
Post Id


Новичок


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


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




caballero пишет:
В любом случае это чушь просто потому чет в этом нет практиеского смысла.
caballero пишет:
Просто подумайте - какой ПРАКТИЧЕСКИЙ смысл в получении списка объектов классов или списка классов.
caballero пишет:
А их список во время выполения не дает абсолютно никакой полезной информации.

Смысл дает не список, а программист. Когда пишет вдруг новый класс, который умеет к примеру выводить версии всех классов, их авторов и т.д.. Классы в данном случае - это плагины или модулы. Их можно вкл и выкл. Может быть хоть так будет понятно.
 
 Top
caballero
Отправлено: 12 Сентября, 2012 - 17:55:47
Post Id


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


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


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




Цитата:
Классы в данном случае - это плагины или модулы. Их можно вкл и выкл. Может быть хоть так будет понятно.

Шо значит включать выключать классы?
И что он вывалит на гора все классы которые на диске лежат?
если это плагины то должен быть список плагииов а не классов.
а если в плагине надо что еще кроме классов как ты это будешь включать

(Отредактировано автором: 12 Сентября, 2012 - 17:57:00)



-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 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