2010-04-15 4 views
4

я хочу использовать магическую функцию __set() и __get() для хранения данных SQL внутри класса php5 и я получаю некоторые странные проблемы с использованием их внутри функции:Используя магическую функцию РНР внутри другой функции не работает

работ:

if (!isset($this->sPrimaryKey) || !isset($this->sTable)) 
return false; 
$id = $this->{$this->sPrimaryKey}; 
if (empty($id)) 
return false; 
echo 'yaay!'; 

не работает:

if (!isset($this->sPrimaryKey) || !isset($this->sTable)) 
    return false; 
if (empty($this->{$this->sPrimaryKey})) 
    return false; 
echo 'yaay!'; 

это было бы PHP ошибка?

ответ

6

empty() first * вызывает метод __isset() и только если он возвращает true метод __get(). т. е. ваш класс должен реализовать __isset().

E.g.

<?php 
class Foo { 

    public function __isset($name) { 
    echo "Foo:__isset($name) invoked\n"; 

    return 'bar'===$name; 
    } 

    public function __get($name) { 
    echo "Foo:__get($name) invoked\n"; 
    return 'lalala'; 
    } 
} 

$foo = new Foo; 
var_dump(empty($foo->dummy)); 
var_dump(empty($foo->bar)); 

печатает

Foo:__isset(dummy) invoked 
bool(true) 
Foo:__isset(bar) invoked 
Foo:__get(bar) invoked 
bool(false) 

* Редактирование: если он не может "напрямую" найти доступную недвижимость в собственность Hashtable объекта.

+0

работ !! Спасибо!! : D – Sirber

+0

Предлагает ли PHP4 '__isset'? –

+0

@ Рихард: нет. '5.1.0 \t Добавлен __isset() и __unset().' – Sirber