| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > PHP: Для профи > Получить изнутри имя объекта класса |
| Автор: мухр 16.12.2007, 03:35 | ||
Как это можно осуществить? Смотрел Reflection API, но так и не нашёл. |
| Автор: skyboy 16.12.2007, 03:39 |
| как мне кажется, невозможно в принципе. а если две переменных будут ссылаться на один и тот же объект - надо будет выводить две строки? А если полсотни переменных? |
| Автор: мухр 16.12.2007, 04:34 | ||||
Если не ошибаюсь, один объект не может иметь несколько имён. Мы пока говорим об имени объекта, а не о ссылках на него, если вы это имеете в виду:
Я хочу избежать необходимости создавать окружение. Возможно ли завязать все процессы внутри объектов, чтобы можно было на произвольном уровне определить в том числе, кто породил данный объект, каким другим объектом вызван данный объект, какой объект стоит надо всем, внутри которого всё осуществляется и др.? Я хочу отказаться от global и оперировать по возможности относительными категориями. |
| Автор: Feldmarschall 16.12.2007, 10:22 |
| А оно надо, вообще, знать имена элементов программы? для отладки поможет debug_backtrace, а для функционала - это, имхо, порочный подход. |
| Автор: WolfON 16.12.2007, 14:52 |
| а зачем оно вообще надо? мне кажется можно сделать по-другому |
| Автор: мухр 16.12.2007, 16:16 |
А оно вообще надо! Этот порочный подход в свою очередь используется в Action Script и, стало быть, во многих первообразных средах программирования - в особенности на основе ООП. И что нельзя никак имя объекта заполучить? Что-то не верится. Расскажите. |
| Автор: SelenIT 16.12.2007, 17:25 |
ActionScript (до 3-ей версии) - не ОО-язык в традиционном понимании. В ООП сабж в кошмаре не приснится, ибо нарушает первую из его основ - инкапсуляцию. Объект знает лишь о том, что передали лично ему, но не обязан и даже не имеет права знать, как его самого обзывают другие (вышестоящие). Имхо, этого и в жизни никому лучше не знать, а то вообще всем работать расхочется... ;) Сначала хотелось бы услышать формулировку задачи, потребовавшей такого странного решения... |
| Автор: мухр 16.12.2007, 17:45 |
| Задача стоит следующим образом. Запускаем контроллер, сообщаем ему некоторые параметры, на базе которых создаётся некоторое внутреннее окружение, которое передаётся по цепи всем остальным объектам, инстанцированным внутри этого контроллера и ниже. Чтобы можно было запустить несколько контроллеров единовременно и параллельно под разными именами (или, допустим, вызвать контроллер из контроллера), и чтобы их окружения никак не пересекались. Единственное решение мне видится пока, это передавать по цепи некоторый объект $ENV, содержащий все необходимые переменные окружения, но мне это кажется не очень удобным, так как приходится следовать некоторому соглашению в правиле написания классов объектов, используемых внутри контроллера. |
| Автор: vasac 16.12.2007, 18:17 | ||||
Во-первых, данный пример так же вполне реален и показывает возможность двух ссылок на одно значение. Во-вторых, в php5 как и во всех современных ООП-языках, значением переменной объектного типа является ссылка на объект. Т.е.
даст две переменные, ссылающиеся на один объект. Нельзя, потому что у объекта нет имени. Оно есть у переменных и свойств. В некоторых системах, возможно, и требуется привязывать объект к имени, но это уже реализуется в самой системе своими средствами. Уверен и в AS это сделано не на уровне языка. |
| Автор: мухр 16.12.2007, 18:19 |
| Anarki, c первым понятно, а вот второй способ, мне кажется, не совсем то, потому что приходится подставлять разные имена в set и забирать через get, соответственно, указывая всё явным образом. Получается как бы два разных кода и две разные конструкции, но речь идёт про одинаковые конструкции, поведение которых различается от различных входящих параметров, переданных через конструктор или ещё как-нибудь. Если я всё до конца улавливаю. |
| Автор: мухр 16.12.2007, 19:13 |
| Тяжело понять это место. Мы имеем отдельное хранилице, в котором регистрируем ссылки на объекты, но как мы потом узнаем, какому объекту принадлежит данная ссылка, если мы имеем несколько экземпляров одного класса с разными ссылками соответственно. Как осуществляется механизм обратной идентификации? |
| Автор: мухр 16.12.2007, 19:28 | ||||||||||||
Разве что вот так, но будет ли это работать? Добавлено через 7 минут и 40 секунд Дубль два. Ещё проще.
А наверное, в регистрацию ещё можно добавить имя класса, чтобы число итераций уменьшить. |
| Автор: Fally 19.12.2007, 20:46 |
| символические ссылки используй для таких целей... но ИМХО, не зачем объекту знать как его звать. |
| Автор: Mal Hack 19.12.2007, 21:22 | ||
Скорее в некоторых языках у объекта есть свойтво Name, в которое IDE сама закатывает имя переменной, ну или ручками... |
| Автор: N0dwis 19.12.2007, 22:40 |
| Гради Буч "Объектно-ориентированный анализ и проектирование". Бьярн Страуструп "Язык программирования C++" (Часть II. Механизмы абстракции). Если возник такой вопрос - подход в принципе не тот. Лучше пересмотреть общую архитектуру, чем изобретать фонарик на солнечных батареях. мухр, задайте конкретный вопрос! |