![]() |
|
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]()
|
|
| ShurikA |
|
|||
![]() Зануда ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1364 Регистрация: 29.10.2005 Где: Канада Репутация: нет Всего: 3 |
Как правильно обратиться к статической функцие класса (не создавая его объекта) если название класса находится в переменной?
|
|||
|
||||
| Mal Hack |
|
|||
![]() Мудрый... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 9926 Регистрация: 15.2.2004 Репутация: 8 Всего: 261 |
В документации есть: http://ru2.php.net/manual/en/language.oop5.static.php
|
|||
|
||||
| ShurikA |
|
|||
![]() Зануда ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1364 Регистрация: 29.10.2005 Где: Канада Репутация: нет Всего: 3 |
Mal Hack,
Именно так и сделал. Но Zend по какой то причине на меня очень круто ругается: "Syntax Error"... |
|||
|
||||
| Mal Hack |
|
|||
![]() Мудрый... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 9926 Регистрация: 15.2.2004 Репутация: 8 Всего: 261 |
ShurikA, а версия PHP у вас какая? Скорее всего 4.
Да и ошибку, хотелось бы увидеть. |
|||
|
||||
| Diesel Draft |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 876 Регистрация: 18.1.2005 Где: Lviv, Ukraine Репутация: нет Всего: 5 |
mixed call_user_func (string function_name [, mixed parameter [, mixed ...]])
Вызывает определённую пользователем функцию, заданную параметром function_name. Выглядит так:
Это сообщение отредактировал(а) Diesel Draft - 14.8.2007, 15:50 |
|||
|
||||
| sTa1kEr |
|
||||
|
9/10 программиста ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1553 Регистрация: 21.2.2007 Репутация: 11 Всего: 146 |
К сожалению, так можно можно только создавать новые объекты с переменным именем класса. Diesel Draft, да, вы правы, только следовало бы добавить, что для вызова именно статического метода следует в качестве первого параметра передавать массив из двух элементов: имя класса и имя метода
Так же можно использовать Reflection. В данном случае преимущество рефлекшена в том, что можно перед вызовом анонимного метода сделать проверку на ошибку
Это сообщение отредактировал(а) sTa1kEr - 14.8.2007, 17:23 |
||||
|
|||||
| Diesel Draft |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 876 Регистрация: 18.1.2005 Где: Lviv, Ukraine Репутация: нет Всего: 5 |
Думаю тема решена. Доставляйте плючики и закрывайте |
|||
|
||||
| Mal Hack |
|
|||
![]() Мудрый... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 9926 Регистрация: 15.2.2004 Репутация: 8 Всего: 261 |
||||
|
||||
| sTa1kEr |
|
|||
|
9/10 программиста ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1553 Регистрация: 21.2.2007 Репутация: 11 Всего: 146 |
http://bugs.php.net/bug.php?id=33463 Добавлено через 22 секунды Status: Wont fix |
|||
|
||||
| Diesel Draft |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 876 Регистрация: 18.1.2005 Где: Lviv, Ukraine Репутация: нет Всего: 5 |
sTa1kEr, Я вот заметил за тобой страдную вещь: ты что мануал на память изучаешь?
|
|||
|
||||
| Mal Hack |
|
|||
![]() Мудрый... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 9926 Регистрация: 15.2.2004 Репутация: 8 Всего: 261 |
sTa1kEr, понял, спасибо.
Diesel Draft, не флейми, а, слющай.. |
|||
|
||||
| Diesel Draft |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 876 Регистрация: 18.1.2005 Где: Lviv, Ukraine Репутация: нет Всего: 5 |
Mal Hack, маленький можно
|
|||
|
||||
| ShurikA |
|
|||
![]() Зануда ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1364 Регистрация: 29.10.2005 Где: Канада Репутация: нет Всего: 3 |
в продолжение:
Если у меня в функцию принемается массив с аргументами. Каким образом мне создать объект определённого класса если он долже создаться следующим образом:
колличество аргументов не определённое. Это сообщение отредактировал(а) ShurikA - 16.8.2007, 22:20 |
|||
|
||||
| Mal Hack |
|
|||
![]() Мудрый... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 9926 Регистрация: 15.2.2004 Репутация: 8 Всего: 261 |
А какая разница сколько параметров?
Вообще, это не хорошо, в ПХП... Знак $ надо убрать перед именем класса. Параметров передаешь сколко хочешь. В конструкторе юзаешь funt_get_args или что-то в этом роде. |
|||
|
||||
| ShurikA |
|
|||
![]() Зануда ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1364 Регистрация: 29.10.2005 Где: Канада Репутация: нет Всего: 3 |
Разница в том что это не должно быть "hardcoded". Создание любого обьекта осуществляется одной и той же функцией (Factory::createInstance(...,...);). По этому и аргументы должны туда передаваться динамическим способом. Я пока сделал так:
пока не знаю если это работает... Не хорошо что??? ты наверное имел в виду: '&'. Почему обрать? Тут уже понятно. |
|||
|
||||
| Diesel Draft |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 876 Регистрация: 18.1.2005 Где: Lviv, Ukraine Репутация: нет Всего: 5 |
Так тоже работает
Думаю що нет. А для исключения хардкора можно передавать массив параметров. |
||||
|
|||||
| sTa1kEr |
|
||||
|
9/10 программиста ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1553 Регистрация: 21.2.2007 Репутация: 11 Всего: 146 |
ShurikA, по ссылке, что я выше приводил, вы, конечно же, не ходили и про рефлекшен не читали?
Как по вашему это будет работать? Вы просто передаете строку в качестве первого параметра. Таким способом можно только через eval() реализовать
Но это плхой стиль и не безопасный способ... "&" - тут действительно не нужен, т.к. это бессмысленно. В PHP 5 все объекты и так передаются всегда по ссылке. Это сообщение отредактировал(а) sTa1kEr - 17.8.2007, 10:17 |
||||
|
|||||
| Mal Hack |
|
|||
![]() Мудрый... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 9926 Регистрация: 15.2.2004 Репутация: 8 Всего: 261 |
Не хорошо делать функции с неизвестным числом параметров.. $ испольуется перед переменной содержащей имя класса, ри доступе к статическим функциям или методам. При создание объекта использоваться НЕ ДОЛЖНО... И пожалуйста, не надо мне тут говорить что-то вроде "ну это же работает"? Заебали уже со своим работает, т.к. НЕ ПРАВИЛЬНО ЭТО.. Мало ли что гребанный, засранный интерпретатор ПХП пропускает, это - НЕ ПРАВИЛЬНО !!! Что за бред создавать объхект от класса, имя которого не известно? Если надо сделать динамическое подключение, модулей, к примеру и т.п., то уж eval, с проверкой..
Достойный вариант. Блин, сделали из нормального языка дырявое подобие средства программирования... (о разработчиках) |
|||
|
||||
| Diesel Draft |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 876 Регистрация: 18.1.2005 Где: Lviv, Ukraine Репутация: нет Всего: 5 |
eval - зло. Если я вижу в коде eval и знаю как это заменить бью по ушам.
Я вот не понимаю почему тебе не нравится $, можно считать что это фича. И я не вижу минусов в этом. |
|||
|
||||
| sTa1kEr |
|
|||
|
9/10 программиста ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1553 Регистрация: 21.2.2007 Репутация: 11 Всего: 146 |
Mal Hack, имхо, все проблемы и недопонимания происходят из-за того, что в PHP нету строго типизированных переменных. Рефлекшен не только не является "не правильным", но и наоборот очень гибкий и полезный инструмент. Через него, к примеру, можно реализовать очень красивый и *стабильный* скрипт для подключения модулей (ищем классы реализующие определенный интерфейс, вызываем методы этого интерфейса для инициализации, конфигурации итп, создаем объекты, работаем).
И это не только в PHP возможно (в .NET возможно даже больше и рефлекшен там *значительно* функциональнее), но в PHP нету никакого контроля над переменными, что и приводит к куче ошибок. Грубо говоря, когда есть переменная типа Type (пример из C#), то мы точно знаем, что такой класс есть и можно не опасаясь вызывать CreateInstance(), а когда есть запись типа new $var(), то черт его знает что в этой переменной (может в ней вообще ресурс какой-нибудь) и откуда она такая взялась (из global variables? или может из extract()? а может ее вообще никогда не было и быть не могло...). Вот откуда ноги растут, а не из-за того, что такой "кривой" PHP разрешает создавать объекты, не известных на момент парсинга, классов. |
|||
|
||||
| ShurikA |
|
|||
![]() Зануда ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1364 Регистрация: 29.10.2005 Где: Канада Репутация: нет Всего: 3 |
Я же уже говорил: |
|||
|
||||
| Diesel Draft |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 876 Регистрация: 18.1.2005 Где: Lviv, Ukraine Репутация: нет Всего: 5 |
А какое предназначение,
|
|||
|
||||
| ShurikA |
|
|||
![]() Зануда ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1364 Регистрация: 29.10.2005 Где: Канада Репутация: нет Всего: 3 |
простота в дальнейшем использовании. |
|||
|
||||
| Diesel Draft |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 876 Регистрация: 18.1.2005 Где: Lviv, Ukraine Репутация: нет Всего: 5 |
ShurikA, вот этого я не понял. Использование где? ну припустим я использую так
|
|||
|
||||
| ShurikA |
|
|||
![]() Зануда ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1364 Регистрация: 29.10.2005 Где: Канада Репутация: нет Всего: 3 |
Diesel Draft,
В таком случае конструктор создаваемого класса должен принимать массив, а этого я хотел избежать. |
|||
|
||||
| Mal Hack |
|
||||
![]() Мудрый... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 9926 Регистрация: 15.2.2004 Репутация: 8 Всего: 261 |
эвал зло в кривых руках ;) sTa1kEr, C# я юзал очень мало, поэтому, мне несколько тяжело сравнивать... В общем случае понимаю, но не совсем. А вот с сями я привык работать... Да, я с тобой полностью согласен, что в конечном итоге все зависит от рук программиста и в том, что ПХП не имеет жесткой типизации и у него нет нормальной перегрузки функций, что очень удобно... Как в тех же Сях, так и в C#... Прямых рук - мало, посему делать надо, рассчитывая на не прямоту рук.... В ПХП именно. т.е. делать ПРАВИЛЬНО, а не так, как можно в принципе...
Фича... echo `rm -r /home/user` - тогда тоже фича... $- знак обращения к переменной. А ты указываешь в new - имя класса. Использование тут динамики - чревато последствиями. |
||||
|
|||||
| ShurikA |
|
|||
![]() Зануда ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1364 Регистрация: 29.10.2005 Где: Канада Репутация: нет Всего: 3 |
Какими же, если не секрет? |
|||
|
||||
| Mal Hack |
|
|||
![]() Мудрый... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 9926 Регистрация: 15.2.2004 Репутация: 8 Всего: 261 |
||||
|
||||
| ShurikA |
|
|||
![]() Зануда ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1364 Регистрация: 29.10.2005 Где: Канада Репутация: нет Всего: 3 |
извини, но мне очень интересен пример... именно на тему взлома |
|||
|
||||
| sTa1kEr |
|
|||
|
9/10 программиста ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1553 Регистрация: 21.2.2007 Репутация: 11 Всего: 146 |
Я как-раз наоборот, очень мало и давно приходилось в Сях работать, но с C# постоянно имею дело. Если бы в Сях было возможно полноценно использовать рефлекшен так же как и в интерпретируемых и компилируемых в байт код языках (таких как C# и Java), то не сомневаюсь, что это было бы более чем востребовано (хотя в MC++ его можно в некоторой степени использовать, но это уже другая тема). Попробую рассказать про рефлекшен на абстрактном уровне. Предположим у нас есть некоторая основная программа и есть библиотека классов (грубо говоря dll) в которой все что имеется - это набор интерфейсов и синглтон класс который при помощи рефлекшена перебирает классы в другой dll (тут даже не важно имя этой dll, оно может так же быть динамичным) ищет и инициализирует классы которые имплементируют именно те интерфейсы, которые в этой dll заложены. Далее получается очень красивая конструкция... в основной программе стоит референс только на dll с интерфейсами и есть любое количество модулей имплементирующий эти интерфейсы... Все! Далее основная программа может работать с этими модулями со 100% уверенностью, что это именно те модули которые предназначены для нее (т.к. они реализуют эти интерфейсы, то ошибки тут исключены) и при этом этой программе не нужно знать ни как и ни где они реализованы, ни их имен, ни чего. Т.о. основная программа абсолютно ничего не знает о модулях, так же и модули абсолютно ничего не знают о основной программе и при этом что бы добавить или удалить модуль достаточно его физически добавить или удалить (dll). То же самое и в PHP, но из-за отсутствия строгой типизации никакой речи о 100% уверенности, что работаем именно с тем модулем нету. Только если проверять это явно. Но это все равно очень мощный механизм не стоит им пренебрегать. |
|||
|
||||
| ShurikA |
|
|||
![]() Зануда ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1364 Регистрация: 29.10.2005 Где: Канада Репутация: нет Всего: 3 |
sTa1kEr,
Вот именно это я и пытаюсь реализовать! Спасибо за поддержку. Это сообщение отредактировал(а) ShurikA - 18.8.2007, 01:10 |
|||
|
||||
| Mal Hack |
|
|||
![]() Мудрый... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 9926 Регистрация: 15.2.2004 Репутация: 8 Всего: 261 |
Я согласен в этом с тобой, но обрати внимание на сказанную тобой же фразу: "но из-за отсутствия строгой типизации никакой речи о 100% уверенности, что работаем именно с тем модулем нету"... Согласисб, работоспособность под вопросом. Плюс, рефлекшон, такая штука, которая в некоторых случаях (в случае кривых рук) может очень хорошо покушать память и выкинуть эксепшон из области памяти... Опять-таки - минус для работоспособности... И самое главное, имхо. У ПХП задачи, далеко не те, что в С#, а все намного проще, а чем проще, тем лучше, надежней и быстрее... Так зачем усложнять себе жизнь "красивыми" извратами, когда все по человечески реализовывается... |
|||
|
||||
| sTa1kEr |
|
|||
|
9/10 программиста ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1553 Регистрация: 21.2.2007 Репутация: 11 Всего: 146 |
Я думаю стоит сойтись на том, что если руки кривые, либо растут не из того места, то пользоваться рефлекшеном крайне не рекомендуется. Сам я полноценно использовал библиотеку рефлекшенов только в одном проекте - исчерпывающая отладка скриптов.
Чуть-чуть оффтопика, для некоторой эмуляции типизации переменных в PHP я иногда использую следующий прием. После каждого класса/интерфейса добавляю функцию с тем же именем и с префиксом Is
Можно, конечно, просто в коде проверять на instanceof, но данный поход имеет еще два плюса: вместо фатальных ошибок генерируется эксепшн, который можно перехватить и обработать. А так же благодаря PHPDoc-у в Zend Studio будет выводится список методов/полей для этого класса/интерфейса. |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | PHP: Для профи | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |