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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Получить изнутри имя объекта класса 
:(
    Опции темы
мухр
Дата 16.12.2007, 03:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Код

class Test
{
  function getObjectName()
  {
    //
    ...
    //
    return $objectName;
  }
}

$simpleTest = New Test;
echo $simpleTest ->getObjectName(); // Выводит 'simpleTest'



Как это можно осуществить? Смотрел Reflection API, но так и не нашёл.

Это сообщение отредактировал(а) мухр - 16.12.2007, 03:35
PM WWW   Вверх
skyboy
Дата 16.12.2007, 03:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 1
Всего: 260



как мне кажется, невозможно в принципе. а если две переменных будут ссылаться на один и тот же объект - надо будет выводить две строки? А если полсотни переменных?
PM MAIL   Вверх
мухр
Дата 16.12.2007, 04:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(skyboy @ 16.12.2007,  03:39)
как мне кажется, невозможно в принципе. а если две переменных будут ссылаться на один и тот же объект - надо будет выводить две строки? А если полсотни переменных?

Если не ошибаюсь, один объект не может иметь несколько имён. Мы пока говорим об имени объекта, а не о ссылках на него, если вы это имеете в виду: 
Код

$simpleTest2 =& $simpleTest;

Я хочу избежать необходимости создавать окружение. Возможно ли завязать все процессы внутри объектов, чтобы можно было на произвольном уровне определить в том числе, кто породил данный объект, каким другим объектом вызван данный объект, какой объект стоит надо всем, внутри которого всё осуществляется и др.? Я хочу отказаться от global и оперировать по возможности относительными категориями.

Это сообщение отредактировал(а) мухр - 16.12.2007, 04:42
PM WWW   Вверх
Feldmarschall
Дата 16.12.2007, 10:22 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


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

Репутация: -2
Всего: 32



А оно надо, вообще, знать имена элементов программы?
для отладки поможет debug_backtrace, а для функционала - это, имхо, порочный подход.
PM   Вверх
WolfON
Дата 16.12.2007, 14:52 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



а зачем оно вообще надо?
мне кажется можно сделать по-другому smile
PM MAIL ICQ   Вверх
мухр
Дата 16.12.2007, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Feldmarschall @  16.12.2007,  10:22 Найти цитируемый пост)
А оно надо, вообще, знать имена элементов программы?

Цитата(WolfON @  16.12.2007,  14:52 Найти цитируемый пост)
а зачем оно вообще надо?
 А оно вообще надо!

Цитата(Feldmarschall @  16.12.2007,  10:22 Найти цитируемый пост)
имхо, порочный подход.
 Этот порочный подход в свою очередь используется в Action Script и, стало быть, во многих первообразных средах программирования - в особенности на основе ООП. И что нельзя никак имя объекта заполучить? Что-то не верится.

Цитата(WolfON @  16.12.2007,  14:52 Найти цитируемый пост)
мне кажется можно сделать по-другому
 Расскажите.

Это сообщение отредактировал(а) мухр - 16.12.2007, 16:18
PM WWW   Вверх
SelenIT
Дата 16.12.2007, 17:25 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 2
Всего: 401



Цитата(мухр @  16.12.2007,  16:16 Найти цитируемый пост)
используется в Action Script

ActionScript (до 3-ей версии) - не ОО-язык в традиционном понимании.

Цитата(мухр @  16.12.2007,  16:16 Найти цитируемый пост)
на основе ООП

В ООП сабж в кошмаре не приснится, ибо нарушает первую из его основ - инкапсуляцию. Объект знает лишь о том, что передали лично ему, но не обязан и даже не имеет права знать, как его самого обзывают другие (вышестоящие). Имхо, этого и в жизни никому лучше не знать, а то вообще всем работать расхочется... ;)

Цитата(мухр @  16.12.2007,  16:16 Найти цитируемый пост)
Расскажите.

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


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
мухр
Дата 16.12.2007, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Задача стоит следующим образом. Запускаем контроллер, сообщаем ему некоторые параметры, на базе которых создаётся некоторое внутреннее окружение, которое передаётся по цепи всем остальным объектам, инстанцированным внутри этого контроллера и ниже. Чтобы можно было запустить несколько контроллеров единовременно и параллельно под разными именами (или, допустим, вызвать контроллер из контроллера), и чтобы их окружения никак не пересекались.
Единственное решение мне видится пока, это передавать по цепи некоторый объект $ENV, содержащий все необходимые переменные окружения, но мне это кажется не очень удобным, так как приходится следовать некоторому соглашению в правиле написания классов объектов, используемых внутри контроллера.

Это сообщение отредактировал(а) мухр - 16.12.2007, 17:56
PM WWW   Вверх
Anarki
Дата 16.12.2007, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



мухр
Вы определитесь, что имеете ввиду под именем объекта. Я считаю, что такой категории не существует. Есть имя класса, может быть атрибут объекта "имя"
Если я правильно вас понял
Код

$simpleTest = new SimpleTestClass();

$simpleTest - это в первую очередь переменная, которая хранит ссылку на объект(PHP5) а не имя объекта.
Цитата(мухр @  16.12.2007,  07:34 Найти цитируемый пост)
Я хочу избежать необходимости создавать окружение. Возможно ли завязать все процессы внутри объектов, чтобы можно было на произвольном уровне определить в том числе, кто породил данный объект, каким другим объектом вызван данный объект, какой объект стоит надо всем, внутри которого всё осуществляется и др.? Я хочу отказаться от global и оперировать по возможности относительными категориями.

Чтобы перестать использовать global...
Как я вижу это можно сделать, не привязываясь к именам переменных.

1. Передавать используемые объекты в конструктор класса.
Код

<?php
class myHelper {
    public function hFunc() {
        echo 'Help function activated!';
    }
}

class simpleTest {
    protected $helper = null;
    public function simpleTest($obj) {
        $this->helper = $obj;
    }
    public function doit() {
        $this->helper->hFunc();
    }
}

$helper = new myHelper();
$st = new simpleTest($helper);
$st->doit();

2. В ZF сделано так, не знаю паттерн ли Registry это или нет. Там существует вспомогательный класс(который представлен единственным объектом в программе - simgleton).
Код

$registry = Zend_Registry::getInstance();
$config = new Zend_Config_Ini('./application/config.ini','general'); 
$registry->set('config', $config);
// ...
$registry->set('dbadapter',$dbAdapter);

Дальше по коду можно использовать объект Zend_Config_Ini ($config) и другие объекты так:
Код

$config = Zend_Registry::get('config');
$dbAdapter = Zend_Registry::get('dbadapter');
$dbAdapter->connect(); // вызываем метод объекта

Это класс со статическими методами, синглтон, имеющий хранилище ссылок на объекты, представленное в виде ассоциативного массива, доступ к которому обеспечивается методами set и get. Думаю это несложно реализовать.



--------------------
PM WWW   Вверх
vasac
Дата 16.12.2007, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата

Мы пока говорим об имени объекта, а не о ссылках на него, если вы это имеете в виду: 
$simpleTest2 =& $simpleTest;

Во-первых, данный пример так же вполне реален и показывает возможность двух ссылок на одно значение.
Во-вторых, в php5 как и во всех современных ООП-языках, значением переменной объектного типа является ссылка на объект. Т.е.
Код

$simpleTest2 = $simpleTest

даст две переменные, ссылающиеся на один объект.

Цитата(мухр @  16.12.2007,  16:16 Найти цитируемый пост)
И что нельзя никак имя объекта заполучить?

Нельзя, потому что у объекта нет имени. Оно есть у переменных и свойств.

В некоторых системах, возможно, и требуется привязывать объект к имени, но это уже реализуется в самой системе своими средствами. Уверен и в AS это сделано не на уровне языка. 
PM WWW   Вверх
мухр
Дата 16.12.2007, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Anarki, c первым понятно, а вот второй способ, мне кажется, не совсем то, потому что приходится подставлять разные имена в set и забирать через get, соответственно, указывая всё явным образом. Получается как бы два разных кода и две разные конструкции, но речь идёт про одинаковые конструкции, поведение которых различается от различных входящих параметров, переданных через конструктор или ещё как-нибудь.
Если я всё до конца улавливаю.

Это сообщение отредактировал(а) мухр - 16.12.2007, 18:19
PM WWW   Вверх
мухр
Дата 16.12.2007, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Anarki @  16.12.2007,  17:58 Найти цитируемый пост)
Это класс со статическими методами, синглтон, имеющий хранилище ссылок на объекты, представленное в виде ассоциативного массива, доступ к которому обеспечивается методами set и get. Думаю это несложно реализовать.
 Тяжело понять это место. Мы имеем отдельное хранилице, в котором регистрируем ссылки на объекты, но как мы потом узнаем, какому объекту принадлежит данная ссылка, если мы имеем несколько экземпляров одного класса с разными ссылками соответственно. Как осуществляется механизм обратной идентификации?
PM WWW   Вверх
мухр
Дата 16.12.2007, 19:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Код

class Regiser
{

  private $container = Array();

  public function set ($name, $obj)
  {
     $this->container[$name] = $obj;
  }

  public function getInstanceName ($obj)
  {
     return array_search($obj, $this->$container);
  }

}


Код

class SimpleClass
{

  public function getInstanseName ()
  {
    global $register;
    return $register->getInstanceName($this);
  }

}


Код

$register = New Register;
$simpleClass = New SimpleClass;
$register->set('simpleClass', $simpleClass);
echo $simpleClass->getInstanceName(); // Должно вернуть 'simpleClass'

Разве что вот так, но будет ли это работать?

Добавлено через 7 минут и 40 секунд
Дубль два. Ещё проще.
Код

class Regiser    
{    
  private $container = Array();    
  public function set ($name)    
  {    
     $this->array_push($container, $name);    
  }    
  public function getInstanceName ($obj)    
  {
    foreach ($this->container as $instanceName)
    {
      global ${$instanceName};
      if ($obj === ${$instanceName}) return $instanceName;
    }    
  }    
}


Код

class SimpleClass    
{    
  public function getInstanseName ()    
  {    
    global $register;    
    return $register->getInstanceName($this);    
  }    
}


Код

$register = New Register;    
$simpleClass = New SimpleClass;    
$register->set('simpleClass');    
echo $simpleClass->getInstanceName(); // Должно вернуть 'simpleClass'

А наверное, в регистрацию ещё можно добавить имя класса, чтобы число итераций уменьшить.
PM WWW   Вверх
Fally
Дата 19.12.2007, 20:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 17.8.2006
Где: Dahla

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



символические ссылки используй для таких целей... но ИМХО, не зачем объекту знать как его звать.


--------------------
Прежде чем задать вопрос на форуме воспользуйтесь поиском.
user posted image
user posted image
PM MAIL   Вверх
Mal Hack
Дата 19.12.2007, 21:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(vasac @  16.12.2007,  18:17 Найти цитируемый пост)
В некоторых системах, возможно, и требуется привязывать объект к имени, но это уже реализуется в самой системе своими средствами. Уверен и в AS это сделано не на уровне языка.  

Скорее в некоторых языках у объекта есть свойтво Name, в которое IDE сама закатывает имя переменной, ну или ручками...
PM ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса

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

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


 




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


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

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