PHP не выбрасывает исключение в функции переопределения - PullRequest
1 голос
/ 20 июля 2011

У меня есть класс с именем DataBoundObject, который довольно большой.И работает хорошо.Это класс ORM, который я разработал.Одной из его функций является автоматическое выполнение функций setXXX () и getXXX (), поэтому кодирование не требуется.Следующая функция делает это

public function __call($strFunction, $arArguments) {
        $strMethodType = substr ( $strFunction, 0, 3 );
        $strMethodMember = substr ( $strFunction, 3 );

        if(!is_callable(array($this, $strFunction)))
            throw new Exception("Function cannot be called!"); 

        switch ($strMethodType) {
            case "set" :
                return ($this->SetAccessor ( $strMethodMember, $arArguments [0] ));
                break;
            case "get" :
                return ($this->GetAccessor ( $strMethodMember ));
                break;
            default :
                throw new Exception ( "Non existent method call dude!" );
        }
        return false;
    }

Теперь в классе, который получает это, я переопределяю одну функцию следующим образом:

<?php

require_once ('DataBoundObject.php');
/** 
 * ORM extension of BUBBLES_HOTEL_REVIEWS Tabel
 * @author footy
 * @copyright Ajitah
 * 
 */
class reviews extends DataBoundObject {
    protected $ReviewID;
    //Other codes

    private function setReviewID($ReviewID) {
        throw new Exception ( "Cannot set the review ID Explicitly" );
    }
    //Other codes
    //Other codes
    //Other codes
    //Other codes
    //Other codes    
}
$x = new reviews();
$x->setReviewID(5);

?>

Таким образом, наконец, я создаю новый объект и пытаюсь вызвать setReviewID() функция, которая является частной.Почему он не генерирует Exception?Кроме того, is_callable() возвращает истину!

РЕДАКТИРОВАТЬ

В основном мне нужна помощь, чтобы исправить эту проблему, чтобы она выдавала Exception

1 Ответ

2 голосов
/ 20 июля 2011

Вы не можете переопределить приватные методы, использующие магию __call в PHP.Я позволю себе процитировать с сайта php.net http://php.net/language.oop5.visibility#92995,, где на ваш вопрос прекрасно ответили в комментарии:

  1. В переопределении имена методов и аргументы(аргументы) должны быть одинаковыми.

  2. окончательные методы не могут быть переопределены.

  3. частные методы никогда не участвуют в переопределении, потому что ониметоды не видны в дочерних классах.

  4. При переопределении уменьшение спецификатора доступа не допускается

Если вам крайне нужна эта функция- ваши (нестандартные) параметры будут:

  1. Использовать публичную область видимости для метода, документируя функцию его ограничений для других разработчиков в строке PHPDoc.
  2. Вы можете использовать такие расширения PECL, как runkit песочница http://php.net/book.runkit
  3. Перейти для генерации кода или препроцессора.
  4. Выбрать другой язык.

РЕДАКТИРОВАТЬ

Обратите внимание, что защищено дочерний метод также скрыт от родительского, но всегда есть возможность переопределить __call () в дочернем.Как правило, создание слишком большого количества «магических» переопределений может быть плохим вкусом для такого серьезного проекта, как ORM.

PS

Я считаю, что в конечном итоге разработка DSL может стать конечной целью вашего проекта.Прежде чем продолжить, ваш проект - хороший способ собрать соответствующий опыт.GL!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...