2010-09-24 4 views
2

Эй SO сообщество, я видел здесь: http://www.mustap.com/phpzone_post_203_setter-and-getter аргумент для использования одним из видов собственности обработки общих для C#, то есть: Если в C#, вы можете определить класс, как это:Должен ли я использовать обработку свойств на C# в PHP?

public class Person 
{ 
    private string _name; 
    public string Name 
    { 
     get{ return _name; } 
     set{ _name = value; } 
    } 
} 

затем почему разумно или нет, чтобы определить подобную недвижимость в PHP, как это:

public class Person 
{ 
    private var $name;  

    public function Name() 
    { 
     if(func_num_args() == 0) { return $this->name; } 
     else {$this->name = func_get_arg(0); } 
    } 
} 
+2

Один вопрос: почему? Какова цель этого над нормальным синтаксисом getter/setter ('getName()' и 'setName ($ name)') или над магическими методами (которые позволяют вам делать '$ foo-> name = 'bar'; echo $ foo-> имя; ')? – ircmaxell

ответ

5

IMO, который не выглядит чистым в PHP. Это похоже на то, что вы пытаетесь загнать C# в PHP, потому что считаете, что это хорошая функция C#.

Я вижу это как: На PHP вы делаете одну функцию для выполнения двух совершенно разных вещей, что не имеет смысла. Между тем, в C# это единственное свойство, которое предназначено для того, чтобы быть единственной точкой доступа для объекта, который нужно установить/получить.

+0

Мои мысли точно. Подумайте, долго и упорно, прежде чем пытаться особенности порта с одного языка на другой. PHP имеет дело с тяжелым трудом геттеров/сеттеров с помощью магических методов. Вместо этого вы можете взглянуть на них. –

+2

Yup, это нарушает [единственный принцип ответственности] (http://en.wikipedia.org/wiki/Separation_of_concerns) (для подпрограмм вместо классов). – ircmaxell

+0

Я верю в свое сообщение, что этот метод может быть реализован до тех пор, пока вы это сделаете правильно – RobertPitt

2

Если вам необходимо сделать некоторые дополнительные проверки значения, который будет установлен вы можете либо определить getFoo и setFoo методы или даже Бетт er использование property overloading. Последнее даст пользователю ощущение получения/настройки собственной собственности. (Последнее - это то, что вы делаете на C#. Только то, что есть только один метод для каждого класса, не так много.)

+0

+1 только правильный ответ до сих пор. – siride

+0

+1, я бы также упомянул, что перегрузка только эмулирует свойства, но не заменяет их. Нет реальной поддержки свойств в php (пока). – user187291

3

Вы нарушаете Single Responsibility Principle, имея одну функцию как геттер, так и сеттер.

В C# это просто синтаксический сахар, и он преобразуется в геттер и сеттер, как и вы должны писать его в php.

В самом деле, в C#, вы можете упростить его дальше, написав

public string Name { get; set; } 

И компилятор сгенерирует закрытое поле подложки, и ваши методы получения и установки функций для вас.

+0

jQuery (отличная часть программного обеспечения) делает это все время. 'x.html (foo)' устанавливает значение, 'x.html()' возвращает. – user187291

+0

Это отличное программное обеспечение, однако они приняли сознательное решение сломать SRP, и только благодаря строгому соблюдению их стандарта это можно сделать. Все/большинство настроек (методы, вызываемые с помощью ввода) возвращают объект jQuery, который позволяет связывать интерфейс. А геттеры без параметров ... иногда. Такие вещи, как '.attr ('name')' является getter, а '.attr ('name', value)' является setter. Вот где это начинает запутываться. Поскольку их функции выполняют более одного значения в зависимости от параметров, потребители библиотеки должны это понимать. Это может сбить с толку. – CaffGeek

2

имеет смысл, например:

class Settings 
{ 
    private $data = array(); 

    public function __call($key,$arguments = array()) 
    { 
     return !count($arguments)) ? $this->data[$key] : $this->data[$key] = $arguments[0]; 
    } 
} 

Затем делает

$Settings = new Settings(); 
$Settings->name('hello'); 
$Settings->foo('bar'); 

Этой теперь создало неограниченного количества анонимных функций, готовых использовать это, как правило, будет построено с использованием 2 методов, __get и __set таким образом вы можете определить разделение для методов и переменных, пример следует

class Settings 
{ 
    private $data = array(); 

    public function __set($key,$val) 
    { 
     $this->data[$key] = $val; 
    } 
    public function __get($key) 
    { 
     return $this->data[$key]; 
    } 
} 

Это позволит затем установить переменные следующим образом:

$Settings->foo = 'bar'; 

Но вы можете пойти немного дальше, то, что и создать переменную системного реестра:

так что в основном вы можете изменить выше класс от Settings к VariableStorage и сделайте следующее:

class User extends VariableStorage{} 
class Profile extends VariableStorage{} 

и использовать так:

$Profile = new Profile('Robert','Pitt',USER_PRIV_ADMIN); 
$Profile->id = 56; 
$Profile->userdata = $Database->GetUserData($Profile); //Reads $Profile->id 

Чтобы вы только должны были определить методы один раз и до тех пор, пока вы строите свою структуру наследования до хорошего дизайна, она может работать очень хорошо.

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