2016-04-14 2 views
1

Я работаю над настраиваемым DB Table Mapper в PHP. Возможно ли в PHP сделать что-то вроде «виртуальных методов» для доступа к свойствам? Подобно методам, которые на самом деле не существуют.Динамические методы PHP

Пример: «Пользователь» класса имеет свойство «$ name», я не хочу создавать метод «Получить» для этого, но я хочу получить доступ к свойству через виртуальный метод, например : $ user-> GetName();

Я думал о работе с конвенциями. Поэтому каждый раз, когда вы вызываете «виртуальный» метод, вы его поймаете и проверяете, имеет ли он префикс «Get» или «Set».

Если у него есть префикс «Get», вы удаляете часть после «Get» и делаете ее строчной буквой, поэтому у вас есть свойство, к которому вы хотите получить доступ.

Моя идея (псевдокод):

public function VirtualMethodCalled($method_name) 
{ 
    //Get the First 3 Chars to check if Get or Set 
    $check = substr($method_name, 0, 3); 

    //Get Everything after the first 3 chars to get the propertyname 
    $property_name = substr($method_name, 3, 0); 

    if($check=="Get") 
    { 
     return $this->{$property_name}; 
    } 
    else if($check=="Set") 
    { 
     $this->{$property_name}; 
     $this->Update(); 
    } 
    else 
    { 
     //throw exc 
    } 
} 
+1

PHP имеет некоторые [магические методы] (http://php.net/__get), которые вы можете использовать. –

+0

Возможно, вы можете заглянуть в закрытие. Закрытие в PHP - это одноразовые * функции/методы *, которые фактически не зарегистрированы в глобальном пространстве имен. Отбросьте функции, если хотите. Обычно используется для расширения функциональности для текущей функции/метода. См. Пример № 3: http://php.net/manual/en/functions.anonymous.php – Marcus

ответ

3

Вы можете использовать магический метод для достижения этой цели, например:

class A { 

    private $member; 


    public function __call($name, $arguments) { 
     //Get the First 3 Chars to check if Get or Set 
     $check = substr($method_name, 0, 3); 

    //Get Everything after the first 3 chars to get the propertyname 
    $property_name = substr($method_name, 3); 

    if($check=="Get") 
    { 
     return $this->{$property_name}; 
    } 
    else if($check=="Set") 
    { 
     $this->{$property_name} = $arguments[0]; //I'm assuming 
    } 
    else 
    { 
     //throw method not found exception 
    } 
    } 
} 

Я в основном с помощью кода вы предоставили для содержания. Вы можете, очевидно, расширить это, чтобы также обрабатывать такие вещи, как псевдонимы имен функций или все, что вам нужно.

+0

работал отлично! Спасибо. –

+0

Вместо использования метода __call magic и проверки первых трех символов имени метода ваше намерение будет лучше выражено с помощью __set и __get. Оба решения решают проблему, но последняя - лучший стиль программирования. Я также заметил, что вы используете соглашение PascalCase для имен методов/функций. Это очень необычно в мире PHP, где camelCase более популярен. –

+0

@ DanielStefaniuk оригинальный вопрос, цитируемый динамическими сеттерами и методами геттера, здесь обсуждается более широкое обсуждение, если сеттеры/геттеры лучше, чем аксессоры/модификаторы, которые также можно найти в соглашениях программирования Java vs C#. Я предпочитаю использовать метод __call для этих вещей, поскольку я обычно использую seters и getters для других свойств, так что общий код использует одно соглашение. – apokryfos

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