2011-01-09 2 views
0

Чтобы проиллюстрировать концепцию Destructor, что база данных обновляется, если значения изменения до объекта уничтожается следующий блок кода приведен в книге:Устный простой PHP код

<?php 
    class use { 
    private $_properties; 
    private $_changedProperties //Keeps a list of the properties that were altered 
    private $_hDB; 

    //_construct and __get omitted for brevity 

    function __set($propertyName, $value) { 
    if(!array_key_exists($propertyName, $this->_properties)) 
    throw new Exception('Invalid property value!'); 

    if(method_exists($this, 'set'. $propertyName)) { 
    return call_user_func(
         array($this, 'set', $propertyName), $value); 
    } 
    else { 
    //If the value of the property really has changed 
    //and it's not already in the changedProperties array, 
    //add it. 

    if($this->_properties[$propertyName] !=$value && !in_array($propertyName,  $this->_changedProperties)) { 
     $this->_changedProperties[] = $propertyName; 
    } 

Остальной код был ненужный код и был опущен. Объясните, пожалуйста, код с точки:

 if(method_exists($this, 'set'. $propertyName)) { 
    return call_user_func(
         array($this, 'set', $propertyName), $value); 
    } 
    else { 
    //If the value of the property really has changed 
    //and it's not already in the changedProperties array, 
    //add it. 

    if($this->_properties[$propertyName] !=$value && !in_array($propertyName, $this->_changedProperties)) { 
     $this->_changedProperties[] = $propertyName; 
    } 

Почему я спрашиваю это то, что я хочу, чтобы проверить мою интерпретацию/понимание кода.

ответ

0

Ваши примечания выглядят правильно ... но это имеет мало общего с фактическим деструктором, хотя я предполагаю, что деструктор проверяет член changedProperties и записывает их, если есть какие-либо до уничтожения. Но это не имеет особого отношения к вашему вопросу, поэтому я думаю, что вы вызываете путаницу, упомянув об этом.

0

Этот код проверяет, существует ли сеттер (метод, устанавливающий значение для свойства) для свойства с именем, заданным аргументом $propertyName, и если такой функции нет, он добавляет это свойство к которое содержит массив, называемый _changedProperties.

Более точно: пусть $propertyName содержит строку "Foo"

if(method_exists($this, 'set'. $propertyName)) { 

Если этот объект имеет метод (иногда называется функцией) с именем setFoo

return call_user_func(array($this, 'set', $propertyName), $value); 

Вызвать метод setFoo с первым аргументом $value и вернуть его результат; эквивалентно вызову return $this->setFoo($value);, но текст Foo параметризуется $propertyName.

}else{ 

В принципе, этот объект не имеет метод, называемый setFoo.

if($this->_properties[$propertyName] != $value 
     && !in_array($propertyName, $this->_changedProperties)) { 

Если значение этого свойства (Foo) имеет сохраненное значение, отличное от одного теперь я знаю, и он не появляется в _changedProperties массиве

 $this->_changedProperties[] = $propertyName; 

Добавьте название этого свойства список измененных свойств. (здесь добавьте Foo в массив _changedProperties.

Смежные вопросы