Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обращение к функцие static, через переменную 
V
    Опции темы
ShurikA
Дата 14.8.2007, 00:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зануда
***


Профиль
Группа: Завсегдатай
Сообщений: 1364
Регистрация: 29.10.2005
Где: Канада

Репутация: нет
Всего: 3



Как правильно обратиться к статической функцие класса (не создавая его объекта) если название класса находится в переменной?


--------------------
Если долго мучиться, что нибудь получится...
user posted image
PM MAIL WWW ICQ Skype   Вверх
Mal Hack
Дата 14.8.2007, 07:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 8
Всего: 261



В документации есть: http://ru2.php.net/manual/en/language.oop5.static.php
Код
<?php
 class Foo {
     public static function aStaticMethod() {
         // ...
     }
 }
 
 Foo::aStaticMethod();
 
 $classname = "Foo";
 print $classname::aStaticMethod();
 ?>

PM ICQ   Вверх
ShurikA
Дата 14.8.2007, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зануда
***


Профиль
Группа: Завсегдатай
Сообщений: 1364
Регистрация: 29.10.2005
Где: Канада

Репутация: нет
Всего: 3



Mal Hack, 
Именно так и сделал. Но Zend по какой то причине на меня очень круто ругается: "Syntax Error"...


--------------------
Если долго мучиться, что нибудь получится...
user posted image
PM MAIL WWW ICQ Skype   Вверх
Mal Hack
Дата 14.8.2007, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 8
Всего: 261



ShurikA, а версия PHP у вас какая? Скорее всего 4.
Да и ошибку, хотелось бы увидеть.
PM ICQ   Вверх
Diesel Draft
Дата 14.8.2007, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 876
Регистрация: 18.1.2005
Где: Lviv, Ukraine

Репутация: нет
Всего: 5



mixed call_user_func (string function_name [, mixed parameter [, mixed ...]])

Вызывает определённую пользователем функцию, заданную параметром function_name.
Выглядит так:

Цитата

function barber ($type) {
    print "You wanted a $type haircut, no problem";
}
call_user_func ('barber', "mushroom");
call_user_func ('barber', "shave");


Это сообщение отредактировал(а) Diesel Draft - 14.8.2007, 15:50


--------------------
НЕДОМА в маси 
PM MAIL WWW ICQ GTalk   Вверх
sTa1kEr
Дата 14.8.2007, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

Репутация: 11
Всего: 146



Цитата(Mal Hack @  14.8.2007,  07:07 Найти цитируемый пост)
print $classname::aStaticMethod();

К сожалению, так можно можно только создавать новые объекты с переменным именем класса.

Diesel Draft, да, вы правы, только следовало бы добавить, что для вызова именно статического метода следует в качестве первого параметра передавать массив из двух элементов: имя класса и имя метода
Код

class a
{
   public static function b()
   {
      echo "Welcome!";
   }
}

$class = "a";
call_user_func(array($class, "b"));

Так же можно использовать Reflection.
В данном случае преимущество рефлекшена в том, что можно перед вызовом анонимного метода сделать проверку на ошибку
Код

class a
{
   public static function b()
   {
      echo "Welcome!";
   }
}

try
{
   $method = new ReflectionMethod("a2", "b");
   $method->invoke(null);
}
catch (ReflectionException $ex)
{
   echo "Error: ".$ex->getMessage();
}



Это сообщение отредактировал(а) sTa1kEr - 14.8.2007, 17:23
PM MAIL   Вверх
Diesel Draft
Дата 14.8.2007, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 876
Регистрация: 18.1.2005
Где: Lviv, Ukraine

Репутация: нет
Всего: 5




Думаю тема решена. Доставляйте плючики и закрывайте  smile 


--------------------
НЕДОМА в маси 
PM MAIL WWW ICQ GTalk   Вверх
Mal Hack
Дата 14.8.2007, 22:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 8
Всего: 261



Цитата(sTa1kEr @  14.8.2007,  17:23 Найти цитируемый пост)
К сожалению, так можно можно только создавать новые объекты с переменным именем класса.

Тогда объясните мне этот пример и какого черта он делает в документации... Никакого создания там нет...
PM ICQ   Вверх
sTa1kEr
Дата 14.8.2007, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

Репутация: 11
Всего: 146



Цитата(Mal Hack @  14.8.2007,  22:09 Найти цитируемый пост)
Тогда объясните мне этот пример и какого черта он делает в документации... Никакого создания там нет... 

http://bugs.php.net/bug.php?id=33463

Добавлено через 22 секунды
Status: Wont fix 
PM MAIL   Вверх
Diesel Draft
Дата 15.8.2007, 00:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 876
Регистрация: 18.1.2005
Где: Lviv, Ukraine

Репутация: нет
Всего: 5



sTa1kEr, Я вот заметил за тобой страдную вещь: ты что мануал на память изучаешь?


--------------------
НЕДОМА в маси 
PM MAIL WWW ICQ GTalk   Вверх
Mal Hack
Дата 15.8.2007, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 8
Всего: 261



sTa1kEr, понял, спасибо.

Diesel Draft, не флейми, а, слющай..
PM ICQ   Вверх
Diesel Draft
Дата 16.8.2007, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 876
Регистрация: 18.1.2005
Где: Lviv, Ukraine

Репутация: нет
Всего: 5



Mal Hack, маленький можно  smile  и конечно слушаю


--------------------
НЕДОМА в маси 
PM MAIL WWW ICQ GTalk   Вверх
ShurikA
Дата 16.8.2007, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зануда
***


Профиль
Группа: Завсегдатай
Сообщений: 1364
Регистрация: 29.10.2005
Где: Канада

Репутация: нет
Всего: 3



в продолжение:
Если у меня в функцию принемается массив с аргументами. Каким образом мне создать объект определённого класса если он долже создаться следующим образом:
Код

$instance = & new $className($arg1, $arg2, ...);


колличество аргументов не определённое.

Это сообщение отредактировал(а) ShurikA - 16.8.2007, 22:20


--------------------
Если долго мучиться, что нибудь получится...
user posted image
PM MAIL WWW ICQ Skype   Вверх
Mal Hack
Дата 16.8.2007, 23:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 8
Всего: 261



А какая разница сколько параметров?
Вообще, это не хорошо, в ПХП...
Знак $ надо убрать перед именем класса. Параметров передаешь сколко хочешь. В конструкторе юзаешь funt_get_args или что-то в этом роде.
PM ICQ   Вверх
ShurikA
Дата 16.8.2007, 23:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зануда
***


Профиль
Группа: Завсегдатай
Сообщений: 1364
Регистрация: 29.10.2005
Где: Канада

Репутация: нет
Всего: 3



Цитата(Mal Hack @  16.8.2007,  22:06 Найти цитируемый пост)
А какая разница сколько параметров?

Разница в том что это не должно быть "hardcoded". Создание любого обьекта осуществляется одной и той же функцией (Factory::createInstance(...,...);). По этому и аргументы должны туда передаваться динамическим способом. Я пока сделал так:
Код

//create the object
$fArgs = $args[0];
for($i=1; $i<count($args); $i++){
   $fArgs .= ','.$args[$i];
}
$instance = & new $classParts($fArgs);
 
пока не знаю если это работает...


Цитата(Mal Hack @  16.8.2007,  22:06 Найти цитируемый пост)
Вообще, это не хорошо, в ПХП...

Не хорошо что???


Цитата(Mal Hack @  16.8.2007,  22:06 Найти цитируемый пост)
Знак $ надо убрать перед именем класса.

ты наверное имел в виду: '&'.
Почему обрать?


Цитата(Mal Hack @  16.8.2007,  22:06 Найти цитируемый пост)
В конструкторе юзаешь funt_get_args или что-то в этом роде.

Тут уже понятно.


--------------------
Если долго мучиться, что нибудь получится...
user posted image
PM MAIL WWW ICQ Skype   Вверх
Diesel Draft
Дата 17.8.2007, 10:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 876
Регистрация: 18.1.2005
Где: Lviv, Ukraine

Репутация: нет
Всего: 5



Цитата(Mal Hack )

Знак $ надо убрать перед именем класса. Параметров передаешь сколко хочешь. В конструкторе юзаешь funt_get_args или что-то в этом роде. 


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

Цитата

пока не знаю если это работает...

Думаю що нет. 

А для исключения хардкора можно передавать массив параметров.


--------------------
НЕДОМА в маси 
PM MAIL WWW ICQ GTalk   Вверх
sTa1kEr
Дата 17.8.2007, 10:16 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

Репутация: 11
Всего: 146



ShurikA, по ссылке, что я выше приводил, вы, конечно же, не ходили и про рефлекшен не читали?
Код

class a
{
   public function __construct($arg1, $arg2, $arg3)
   {
      echo "Welcome!";
   }
}

$className = "a"; // Переменное имя класса
$args = array("a", 1, true); // Переменное число аргументов
try
{
   $class = new ReflectionClass($className);
   $obj = $class->newInstanceArgs($args);
}
catch (ReflectionException $ex)
{
   echo "Error: ".$ex->getMessage();
}

Цитата(ShurikA @  16.8.2007,  23:38 Найти цитируемый пост)
Я пока сделал так:

Как по вашему это будет работать? Вы просто передаете строку в качестве первого параметра. Таким способом можно только через eval() реализовать
Код

$instance = eval('return new $classParts("'.implode('", "', $args).'");');

Но это плхой стиль и не безопасный способ...

Цитата(ShurikA @  16.8.2007,  23:38 Найти цитируемый пост)
ты наверное имел в виду: '&'.
Почему обрать?

"&" - тут действительно не нужен, т.к. это бессмысленно. В PHP 5 все объекты и так передаются всегда по ссылке.

Это сообщение отредактировал(а) sTa1kEr - 17.8.2007, 10:17
PM MAIL   Вверх
Mal Hack
Дата 17.8.2007, 14:33 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 8
Всего: 261



Цитата(ShurikA @  16.8.2007,  23:38 Найти цитируемый пост)
Не хорошо что???

Не хорошо делать функции с неизвестным числом параметров..

Цитата(ShurikA @  16.8.2007,  23:38 Найти цитируемый пост)
Почему обрать?

Цитата(Diesel Draft @  17.8.2007,  10:01 Найти цитируемый пост)
Так тоже работает

$ испольуется перед переменной содержащей имя класса, ри доступе к статическим функциям или методам. При создание объекта использоваться НЕ ДОЛЖНО...
И пожалуйста, не надо мне тут говорить что-то вроде "ну это же работает"? Заебали уже со своим работает, т.к. НЕ ПРАВИЛЬНО ЭТО.. Мало ли что гребанный, засранный интерпретатор ПХП пропускает, это - НЕ ПРАВИЛЬНО !!!
Что за бред создавать объхект от класса, имя которого не известно? Если надо сделать динамическое подключение, модулей, к примеру и т.п., то уж eval, с проверкой..

Цитата(Diesel Draft @  17.8.2007,  10:01 Найти цитируемый пост)
А для исключения хардкора можно передавать массив параметров. 

Достойный вариант.



Блин, сделали из нормального языка дырявое подобие средства программирования... (о разработчиках)
PM ICQ   Вверх
Diesel Draft
Дата 17.8.2007, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 876
Регистрация: 18.1.2005
Где: Lviv, Ukraine

Репутация: нет
Всего: 5



eval - зло. Если я вижу в коде eval и знаю как это заменить бью по ушам.
Я вот не понимаю почему тебе не нравится $, можно считать что это фича. И я не вижу минусов в этом.


--------------------
НЕДОМА в маси 
PM MAIL WWW ICQ GTalk   Вверх
sTa1kEr
Дата 17.8.2007, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

Репутация: 11
Всего: 146



Mal Hack, имхо, все проблемы и недопонимания происходят из-за того, что в PHP нету строго типизированных переменных. Рефлекшен не только не является "не правильным", но и наоборот очень гибкий и полезный инструмент. Через него, к примеру, можно реализовать очень красивый и *стабильный* скрипт для подключения модулей (ищем классы реализующие определенный интерфейс, вызываем методы этого интерфейса для инициализации, конфигурации итп, создаем объекты, работаем).

И это не только в PHP возможно (в .NET возможно даже больше и рефлекшен там *значительно* функциональнее), но в PHP нету никакого контроля над переменными, что и приводит к куче ошибок. 
Грубо говоря, когда есть переменная типа Type (пример из C#), то мы точно знаем, что такой класс есть и можно не опасаясь вызывать CreateInstance(), а когда есть запись типа new $var(), то черт его знает что в этой переменной (может в ней вообще ресурс какой-нибудь) и откуда она такая взялась (из global variables? или может из extract()? а может ее вообще никогда не было и быть не могло...). Вот откуда ноги растут, а не из-за того, что такой "кривой" PHP разрешает создавать объекты, не известных на момент парсинга, классов.
PM MAIL   Вверх
ShurikA
Дата 17.8.2007, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зануда
***


Профиль
Группа: Завсегдатай
Сообщений: 1364
Регистрация: 29.10.2005
Где: Канада

Репутация: нет
Всего: 3



Цитата(Mal Hack @  17.8.2007,  13:33 Найти цитируемый пост)
Что за бред создавать объхект от класса, имя которого не известно?

Я же уже говорил:
Цитата(ShurikA @  16.8.2007,  22:38 Найти цитируемый пост)
Создание любого обьекта осуществляется одной и той же функцией (Factory::createInstance(...,...);). По этому и аргументы должны туда передаваться динамическим способом.




--------------------
Если долго мучиться, что нибудь получится...
user posted image
PM MAIL WWW ICQ Skype   Вверх
Diesel Draft
Дата 17.8.2007, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 876
Регистрация: 18.1.2005
Где: Lviv, Ukraine

Репутация: нет
Всего: 5



А какое предназначение,


--------------------
НЕДОМА в маси 
PM MAIL WWW ICQ GTalk   Вверх
ShurikA
Дата 17.8.2007, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зануда
***


Профиль
Группа: Завсегдатай
Сообщений: 1364
Регистрация: 29.10.2005
Где: Канада

Репутация: нет
Всего: 3



Цитата(Diesel Draft @  17.8.2007,  16:44 Найти цитируемый пост)
А какое предназначение, 

простота в дальнейшем использовании.


--------------------
Если долго мучиться, что нибудь получится...
user posted image
PM MAIL WWW ICQ Skype   Вверх
Diesel Draft
Дата 17.8.2007, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 876
Регистрация: 18.1.2005
Где: Lviv, Ukraine

Репутация: нет
Всего: 5



ShurikA, вот этого я не понял. Использование где? ну припустим я использую так

Код

      static function LoadPage($name, $param = array()){
         
         if($className = strrchr($name, '/')){
            $className = substr($className, 1);
         }else{
          $className = $name;
         } 
          
         if(!class_exists($className)){
            Loader::UsePage($name);
         }
         $page = new $className($param);
         return $page->Bind();
      }



--------------------
НЕДОМА в маси 
PM MAIL WWW ICQ GTalk   Вверх
ShurikA
Дата 17.8.2007, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зануда
***


Профиль
Группа: Завсегдатай
Сообщений: 1364
Регистрация: 29.10.2005
Где: Канада

Репутация: нет
Всего: 3



Diesel Draft, 
В таком случае конструктор создаваемого класса должен принимать массив, а этого я хотел избежать.


--------------------
Если долго мучиться, что нибудь получится...
user posted image
PM MAIL WWW ICQ Skype   Вверх
Mal Hack
Дата 17.8.2007, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 8
Всего: 261



Цитата(Diesel Draft @  17.8.2007,  14:47 Найти цитируемый пост)
eval - зло. Если я вижу в коде eval и знаю как это заменить бью по ушам.

эвал зло в кривых руках ;)

sTa1kEr, C# я юзал очень мало, поэтому, мне несколько тяжело сравнивать... В общем случае понимаю, но не совсем. А вот с сями я привык работать...
Да, я с тобой полностью согласен, что в конечном итоге все зависит от рук программиста и в том, что ПХП не имеет жесткой типизации  и у него нет нормальной перегрузки функций, что очень удобно... Как в тех же Сях, так и в C#...
Прямых рук - мало, посему делать надо, рассчитывая на не прямоту рук.... В ПХП именно. т.е. делать ПРАВИЛЬНО, а не так, как можно в принципе...

Цитата(Diesel Draft @  17.8.2007,  14:47 Найти цитируемый пост)
Я вот не понимаю почему тебе не нравится $, можно считать что это фича. И я не вижу минусов в этом. 

Фича... echo `rm -r /home/user` - тогда тоже фича...
$- знак обращения к переменной. А ты указываешь в new - имя класса. Использование тут динамики - чревато последствиями.

PM ICQ   Вверх
ShurikA
Дата 17.8.2007, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зануда
***


Профиль
Группа: Завсегдатай
Сообщений: 1364
Регистрация: 29.10.2005
Где: Канада

Репутация: нет
Всего: 3



Цитата(Mal Hack @  17.8.2007,  21:54 Найти цитируемый пост)
Использование тут динамики - чревато последствиями

Какими же, если не секрет?


--------------------
Если долго мучиться, что нибудь получится...
user posted image
PM MAIL WWW ICQ Skype   Вверх
Mal Hack
Дата 17.8.2007, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 8
Всего: 261



Цитата(ShurikA @  17.8.2007,  22:59 Найти цитируемый пост)
Какими же, если не секрет? 

Возможеным взломом, возможным падением скрипта из-за ошибки памяти.
Это так, на первый вкус...
PM ICQ   Вверх
ShurikA
Дата 17.8.2007, 23:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зануда
***


Профиль
Группа: Завсегдатай
Сообщений: 1364
Регистрация: 29.10.2005
Где: Канада

Репутация: нет
Всего: 3



Цитата(Mal Hack @  17.8.2007,  22:10 Найти цитируемый пост)
Возможеным взломом

извини, но мне очень интересен пример... именно на тему взлома smile


--------------------
Если долго мучиться, что нибудь получится...
user posted image
PM MAIL WWW ICQ Skype   Вверх
sTa1kEr
Дата 18.8.2007, 00:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

Репутация: 11
Всего: 146



Цитата(Mal Hack @  17.8.2007,  22:54 Найти цитируемый пост)
C# я юзал очень мало, поэтому, мне несколько тяжело сравнивать... В общем случае понимаю, но не совсем. А вот с сями я привык работать...

Я как-раз наоборот, очень мало и давно приходилось в Сях работать, но с C# постоянно имею дело. Если бы в Сях было возможно полноценно использовать рефлекшен так же как и в интерпретируемых и компилируемых в байт код языках (таких как C# и Java), то не сомневаюсь, что это было бы более чем востребовано (хотя в MC++ его можно в некоторой степени использовать, но это уже другая тема). Попробую рассказать про рефлекшен на абстрактном уровне.

Предположим у нас есть некоторая основная программа и есть библиотека классов (грубо говоря dll) в которой все что имеется - это набор интерфейсов и синглтон класс который при помощи рефлекшена перебирает классы в другой dll (тут даже не важно имя этой dll, оно может так же быть динамичным) ищет и инициализирует классы которые имплементируют именно те интерфейсы, которые в этой dll заложены. Далее получается очень красивая конструкция... в основной программе стоит референс только на dll с интерфейсами и есть любое количество модулей имплементирующий эти интерфейсы... Все! Далее основная программа может работать с этими модулями со 100% уверенностью, что это именно те модули которые предназначены для нее (т.к. они реализуют эти интерфейсы, то ошибки тут исключены) и при этом этой программе не нужно знать ни как и ни где они реализованы, ни их имен, ни чего. Т.о. основная программа абсолютно ничего не знает о модулях, так же и модули абсолютно ничего не знают о основной программе и при этом что бы добавить или удалить модуль достаточно его физически добавить или удалить (dll).

То же самое и в PHP, но из-за отсутствия строгой типизации никакой речи о 100% уверенности, что работаем именно с тем модулем нету. Только если проверять это явно. Но  это все равно очень мощный механизм не стоит им пренебрегать.
PM MAIL   Вверх
ShurikA
Дата 18.8.2007, 01:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зануда
***


Профиль
Группа: Завсегдатай
Сообщений: 1364
Регистрация: 29.10.2005
Где: Канада

Репутация: нет
Всего: 3



sTa1kEr, 
 smile 

Вот именно это я и пытаюсь реализовать!   Спасибо за поддержку.

Это сообщение отредактировал(а) ShurikA - 18.8.2007, 01:10


--------------------
Если долго мучиться, что нибудь получится...
user posted image
PM MAIL WWW ICQ Skype   Вверх
Mal Hack
Дата 18.8.2007, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 8
Всего: 261



Цитата(sTa1kEr @  18.8.2007,  00:50 Найти цитируемый пост)
То же самое и в PHP, но из-за отсутствия строгой типизации никакой речи о 100% уверенности, что работаем именно с тем модулем нету. Только если проверять это явно. Но  это все равно очень мощный механизм не стоит им пренебрегать. 

Я согласен в этом с тобой, но обрати внимание на сказанную тобой же фразу: "но из-за отсутствия строгой типизации никакой речи о 100% уверенности, что работаем именно с тем модулем нету"... Согласисб, работоспособность под вопросом. Плюс, рефлекшон, такая штука, которая в некоторых случаях (в случае кривых рук) может очень хорошо покушать память и выкинуть эксепшон из области памяти... Опять-таки - минус для работоспособности...
И самое главное, имхо. У ПХП задачи, далеко не те, что в С#, а все намного проще, а чем проще, тем лучше, надежней и быстрее...
Так зачем усложнять себе жизнь "красивыми" извратами, когда все по человечески реализовывается...
PM ICQ   Вверх
sTa1kEr
Дата 20.8.2007, 14:08 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

Репутация: 11
Всего: 146



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

Чуть-чуть оффтопика, для некоторой эмуляции типизации переменных в PHP я иногда использую следующий прием. После каждого класса/интерфейса добавляю функцию с тем же именем и с префиксом Is
Код

interface ISomeInterface
{
   function SomeMethod();
}

/**
 * @param mixed $object
 * @return ISomeInterface
 */
function IsISomeInterface($object)
{
   if (!$object instanceof ISomeInterface)
   {
      throw new TypeException($object, "ISomeInterface");
   }
   return $object;
}

Можно, конечно, просто в коде проверять на instanceof, но данный поход имеет еще два плюса: вместо фатальных ошибок генерируется эксепшн, который можно перехватить и обработать. А так же благодаря PHPDoc-у в Zend Studio будет выводится список методов/полей для этого класса/интерфейса.
PM MAIL   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса

Внимание: данный раздел предназначен для решения сложных, нестандартных задач.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Для профи | Следующая тема »


 




[ Время генерации скрипта: 0.0809 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.