Передача объекта по умолчанию по ссылке

Ямерт

The Old One
Передача объекта по умолчанию по ссылке

...не работает - PHP такого синтаксиса не понимает.

Т.е., например конструкция типа function Foo (&$obj = null) не работает.
Параметр по умолчанию не может быть одновременно передан по ссылке - так получается?

Кстати, если бы в PHP была возможна перегрузка функций, такую проблему можно было бы обойти...
 

pupkin

Guest
Значение по умолчанию вроде как должно представлять собой константное выражение и не может являться переменной или членом класса..
Так?
 

pupkin

Guest
Бр-р-р.. я сам запуталси.. озадачил.
А зачем это тебе?
 

Ямерт

The Old One
Надо в функцию передать объект PEAR::DB; если не передаётся, создать внутри новый.
Если бы была перегрузка функций, можно было бы сделать так:
PHP:
function Foo (&$DB_obj)
{
   //...use PEAR::DB object
}

function Foo ()
{
  $DB_obj = initDBObject();
   //...use PEAR::DB object
}
 

Green Mother

Guest
Не понимает, и правильно делает, имхо.
Указатель на объект не может быть константой. Т.е. если мы определяем ф-ю как
PHP:
function Foo (&$DB_obj) 
{ 
   //...use PEAR::DB object 
}
то предполагаем, что объект на момент вызова функции будет существовать. Понятно выразился?
 

Green Mother

Guest
В том то и дело. Перечитайте еще раз приведенную Вами же строку мана. :)
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Автор оригинала: Ямерт
Надо в функцию передать объект PEAR:: DB; если не передаётся, создать внутри новый.
Если бы была перегрузка функций, можно было бы сделать так:
Делай так:
PHP:
function Foo (&$DB_obj)
{
   if (null === $DB_obj) {
       // создаём новый объект
   }
}
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Автор оригинала: Ямерт
Понравилось, работает.
Передаётся-то как reference?

Я тут наконец вчитался в вопрос и понял задачу. :D
Сам я обычно не передаю объект и не объявляю его глобальным. Подход следующий:
PHP:
function Foo () 
{ 
  $DB_obj =& Registry::instance('db'); 
}

class Registry
{
   function &instance($type)
   {
       // Если экземпляр типа $type существует, то вернуть его
       // Если не существует, то подгрузить файл, создать объект, провести прочую инициализацию и вернуть
       // $type здесь, например 'db', 'template', 'auth'
   }
}
Т.е. такая помесь "Одиночки" и "Фабрики".
 

Ямерт

The Old One
Передаётся-то как reference?
Хм, нет! Я сам только что об этом подумал :D Ведь аргумент не декларируется как &$arg - следовательно, по ссылке передать его просто невозможно, используя func_get_arg().
Подход следующий
Хмм, да , это пожалуй лучший выход. Спасибо!
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Ямерт, почисти свои приватные сообщения, а то я тебе новое отправить не могу.

Отвечаю здесь:
Где эти объекты хранить? В статическом массиве?
Либо в статическом массиве (функции), либо в глобальной переменной.
Тут, конечно, отсутствие стат. переменных класса напрягает. :(
 

Ямерт

The Old One
Ага, потёр лишнее - спасибо, а то не заметил.
Тут, конечно, отсутствие стат. переменных класса напрягает
И не только тут.
Вот один пример того, насколько нужны статические свойства в классе:
функция класса по осуществлению транзакции возвращает несколько возможных статусов проведения операции. Эти статусы - константы, и _ПО ИДЕЕ_ они - часть класса. Но в PHP это нельзя реализовать. Приходится юзать define(), а эти константы глобальны :(
 
Сверху