2

我正在从网站上单独学习 PHP。我有一些其他语言的 OOP 背景。
问题 1:
这是用 2 组不同的参数在 PHP 中实现构造函数的正确方法吗?
问题 2:
当我来到 PHP 中的 __set 魔术方法时,我希望此类中的 comment_id 不能从 __set 函数中更改。这可以在 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; 
        }

    }
    }
4

4 回答 4

2
  1. 在 PHP 中声明“多个”构造函数的方法有很多,但没有一种是“正确”的做法(因为 PHP 在技术上不允许这样做)。但是,我认为您在那里的操作方式没有任何问题。如果您想了解更多信息,请查看此 Stack Overflow 问题

  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; 
        }
    }
    
于 2012-04-29T10:34:27.153 回答
1

正如这里和在 PHP 中执行多个构造函数的最佳方式所示,在 PHP中有许多声明multiple构造函数的方法。这是另一个例子:

<?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.');

来源:使用和理解多个构造函数的最简单方法:

希望这可以帮助。

于 2015-01-24T06:55:49.933 回答
0

对于问题 1,请查看这篇文章Best way to do multiple constructors in PHP

对于问题 2,您可以在 __set 函数中过滤掉 comment_id 属性。

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

}
于 2012-04-29T10:29:05.280 回答
0

问题一

这是在 PHP 中使用 2 组不同的参数实现构造函数的正确方法吗?

是的(嗯,至少正确的方法,正如其他海报所指出的那样)。default我能想到的一项改进是在分支中抛出异常。

问题 2

当我来到 PHP 中的 __set 魔术方法时,我希望此类中的 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,
    ));
  }
}

但是这里有一个限制,请参阅此评论

于 2012-04-29T10:31:17.967 回答