2010-04-29 3 views
2

Я только начал изучать PHP OOP, ранее я делал PHP процедурно. Я читал this article и у меня есть несколько быстрых вопросов,PHP OOP Concepts (Объекты Value/Объекты доступа к данным)

  1. Как конструктор для объектов значений обычно определяется? Как один, который принимает во все «члены данных» параметры или придерживается конструктора по умолчанию и использует методы mutator/accessor для установки/получения данных?

  2. Действительно ли это рекомендуемый способ начать работу с PHP OOP? Честно говоря, понятия, объясненные в статье, были для меня немного запутанными.

Приветствие

+2

Я никогда не видел эти рекомендации в контексте PHP раньше. PHP-программисты, как правило, предпочитают MVC. Несколько предложений на этой странице являются весьма спорными и не представляют собой популярное мнение. –

+0

* (альтернативное чтение) * http://carsonified.com/blog/dev/getting-started-with-oop-php5/ – Gordon

+0

Шаблон DAO является одним из способов обработки части слоя M в шаблоне MVC. DAO не заменяет MVC. –

ответ

1
  1. Для создания объектов, которые действуют как нейтральные контейнеры данных я хотел бы использовать классический конструктор __contruct() вы можете использовать магию __get и __set доступ к свойствам. Другой способ ввода данных с помощью объекта строки db, например, вы можете найти более подробную информацию об этом путем googling 'dependency injection'

  2. Вы можете запустить его, как на большинстве языков ООП, с помощью основного класса, но для веб-проблем MVC широко используется.

У вас есть опыт программирования ООП?

2

Объекты должны быть в действующем состоянии. Это означает, что объект всегда ведет себя (методы) и содержит информацию (переменные-члены), которые имеют смысл. Целью конструктора является создание объекта в допустимом состоянии.

С учетом объектов значения конструктор должен принимать минимальное количество аргументов, чтобы объект имел смысл. Например, если у вас есть объект значения RGB, будет ли это иметь смысл в вашем приложении, если красный цвет был строкой «обезьяна», зеленый был NULL, а синий был массивом?

final class RGB { 
    $r, $g, $b; 
} 

$mycolor = new RGB; 

// NULL, what value of red is that supposed to be? 
var_dump($mycolor->r); 

// We are free to set these values too, even though they do not make sense. 
$mycolor->r = 'monkey'; 
$mycolor->g = NULL; 
$mycolor->b = array('foo', 'bar'); 

Это именно то, что позволяет этот объект. $ mycolor ссылается на объект, который не находится в допустимом состоянии. Как мы можем гарантировать, что объект RGB всегда имеет три значения: красный, синий и зеленый, и что все они находятся между 0 и 255?

final class RGB { 

    private $r; 
    private $g; 
    private $b; 

    public function __construct($r, $g, $b) { 

     // are our arguments numbers? 

     if (!is_numeric($r)) { 
      throw new Exception('Value of red must be a number'); 
     } 
     if (!is_numeric($g)) { 
      throw new Exception('Value of green must be a number'); 
     } 
     if (!is_numeric($b)) { 
      throw new Exception('Value of blue must be a number'); 
     } 

     // are our arguments within range 0-255? 

     if ($r < 0 || $r > 255) { 
      throw new Exception('Value of red must be 0-255'); 
     } 
     if ($g < 0 || $g > 255) { 
      throw new Exception('Value of green must be 0-255'); 
     } 
     if ($b < 0 || $b > 255) { 
      throw new Exception('Value of blue must be 0-255'); 
     } 

     // our arguments are fine. 

     $this->r = $r; 
     $this->g = $g; 
     $this->b = $b; 

    } 

    //*// Canadian support 

    public function getColour() { 

     return $this->getColor(); 

    } 

    public function getColor() { 

     return array($this->r, $this->g, $this->b); 

    } 

} 

$mycolor = new RGB; // error! missing three arguments 
$mycolor->r = 'monkey'; // error! this field is private 

// exception! the constructor complains about our values not being numbers 
$mycolor2 = new RGB('monkey', NULL, array('foo', 'bar')); 

// exception! the constructor complains our numbers are not in range 
$mycolor3 = new RGB(300, 256, -10); 

$mycolor4 = new RGB(255, 0, 0); // ahh... a nice shade of red 
var_dump($mycolor4->getColor()); // we can read it out later when we need to 

Если конструктор требует три аргумента, и он бросает исключение, если все три не являются числа от 0 до 255, вы всегда будете определяющими переменными-членов с хорошими значениями.

Вы также должны убедиться в том, что переменные типа «красный», «синий» и «зеленый» являются закрытыми. В противном случае любой может написать все, что захочет. Конечно, если они частные, никто не может их прочесть. Чтобы создать операцию только для чтения, мы определяем метод getColor(), который обращается к частным переменным-членам для нас.

Эта версия объекта RGB всегда будет иметь действующее состояние.

Надеюсь, это проливает некоторый свет на природу ООП и дает вам место, о котором можно подумать.

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