2012-04-29 2 views
2

Я изучаю только PHP с веб-сайтов. У меня есть фон ООП на других языках.
Вопрос 1:
Является ли это правильный способ реализовать конструктор в PHP с 2 разным набором параметров?
Вопрос 2:
Когда я иду в __set магического метода в PHP Я хочу, чтобы comment_id в этом классе не может быть изменен с __set функции. Возможно ли это сделать в PHP?
oop PHP несколько конструкторов

class Comment{ 
    private $comment_id; 
    private $image_id; 
    private $author_id; 
    private $comment_text; 
    private $created_at; 

    public function __construct() 
    { 
     $arguments = func_get_args(); 
     $num = sizeof($arguments) 
     switch($num) 
     { 
      case 0; 
       break; 
      case 3: 
       this->image_id = $arguments[0]; 
       this->author_id = $arguments[1]; 
       this->comment_text = $argument[2]; 
       break; 
      case 5: 
       this->comment_id = $arguments[0]; 
       this->image_id = $arguments[1]; 
       this->author_id = $argument[2]; 
       this->comment_text = $argument[3]; 
       this->created_at = $argument[4]; 
       break; 
      default: 
       break; 

     } 
    } 

    public function __get($property) 
    { 
     if(property_exists($this,$property)) 
     { 
      return $this->$property; 
     } 
    } 

    public function __set($property_name,$value) 
    { 
     if(property_exists($this,$property_name)) 
     { 
      $this->$property_name = $value; 
     } 

    } 
    } 
+0

Pls Проверьте этот http://stackoverflow.com/questions/2169448/why-cant-i-overload-constructors-in-php – Sethunath

+0

возможный дубликат [Лучший способ сделать несколько конструкторов в PHP] (http: // stackoverflow.com/questions/1699796/best-way-to-do-multiple-constructors-in-php) – Gordon

+0

Это просто ужасная практика, когда она подходит к надлежащему ООП –

ответ

2
  1. Есть много способов объявить «нескольких» конструкторов в PHP, но ни один из них не являются «правильным» способом сделать это (поскольку PHP технически не позволяет). Однако я не вижу ничего плохого в том, как вы это делаете. Если вам нужна дополнительная информация, посетите this Stack Overflow question.

  2. Вы можете просто использовать заявление if. Что-то вроде этого, может быть?

    public function __set($property_name,$value) 
    { 
        $hidden_properties = array(
         'comment_id', 
         'any_other_properties' 
        ); 
    
        if(!in_array($property_name, $hidden_properties) && 
         property_exists($this, $property_name)) 
        { 
         $this->$property_name = $value; 
        } 
    } 
    
0

На вопрос 1 проверить этот пост Best way to do multiple constructors in PHP

На вопрос 2 вы можете отфильтровать comment_id атрибут в вашей функции __set.

public function __set($property_name,$value) 
{ 
    if (property_exists($this, $property_name) && $property_name !== 'comment_id') 
    { 
     $this->$property_name = $value; 
    } 

} 
0

Вопрос 1:

Является ли это правильный способ реализовать конструктор в PHP с 2 разным набором параметров?

Да (ну, по крайней мере, правильный путь, как и другие плакаты указали). Одно улучшение, о котором я могу думать, - это выбросить исключение в ветку default.

Вопрос 2:

Когда я иду в __set магического метода в PHP Я хочу, чтобы comment_id в этом классе не может быть изменен с __set функции. Возможно ли это сделать в PHP?

Конечно, вы почти там:

public function __set($property_name,$value) { 
    if(property_exists($this,$property_name)) { 
    if($property_name == "comment_id") { 
     // throw an exception? ignore? 
    } else { 
     $this->$property_name = $value; 
    } 
    } else { 
    throw new Exception(strtr("Class {class} does not have property {property}!", array(
     '{class}' => get_class($this), 
     '{property}' => $property_name, 
    )); 
    } 
} 

Но есть ограничение здесь, см this comment.

+0

Я бы сказал, что ответ на вопрос Q1: Нет, поскольку ctors для установки объекта в допустимое состояние и путем передачи нулевых аргументов в ctor ни один из наборов не требуется для этой цели, следовательно, они должны быть либо в сеттерах, либо в статических заводских методах, либо на специализированной фабрике. Аналогично, в то время как OP * может * добавить все это беспорядок в '__set', ему лучше сделать все изменяемые поля общедоступными и просто предоставить getter или magic' __get' для comment_id. – Gordon

0

Как уже было показано здесь и Best way to do multiple constructors in PHP, есть много способов объявить multiple конструкторов в PHP. Вот еще один пример:

<?php 

class myClass { 
    public function __construct() { 
     $get_arguments  = func_get_args(); 
     $number_of_arguments = func_num_args(); 

     if (method_exists($this, $method_name = '__construct'.$number_of_arguments)) { 
      call_user_func_array(array($this, $method_name), $get_arguments); 
     } 
    } 

    public function __construct1($argument1) { 
     echo 'constructor with 1 parameter ' . $argument1 . "\n"; 
    } 

    public function __construct2($argument1, $argument2) { 
     echo 'constructor with 2 parameter ' . $argument1 . ' ' . $argument2 . "\n"; 
    } 

    public function __construct3($argument1, $argument2, $argument3) { 
     echo 'constructor with 3 parameter ' . $argument1 . ' ' . $argument2 . ' ' . $argument3 . "\n"; 
    } 
} 

$object1 = new myClass('BUET'); 
$object2 = new myClass('BUET', 'is'); 
$object3 = new myClass('BUET', 'is', 'Best.'); 

Источник: the easiest way to use and understand multiple constructors:

Надеется, что это помогает.

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