我班上有一些公共变量,这就是我如何定义它们
class MyClass
{
public $var1;
public $var2;
public $var3;
function __construct($params)
{
if(isset($params['var1']))
$this->var1 = $params['var1'];
if(isset($params['var2']))
$this->var3 = $params['var2'];
if(isset($params['var3']))
$this->var3 = $params['var3'];
}
}
但正如我所说,theese是可选参数。有些对象会使用它,有些会不会使用它。我的问题是我每次都在定义它,即使它被使用或不使用。我应该在传递类似的东西时定义它:
if(isset($params['var1']))
public $var1 = $params['var1'];
我是php的新手,只需要知道我在顶部做的是对的吗?
编辑:错字
答案 0 :(得分:2)
变量对于对象是可选的..但是是类的属性..
对于某些对象,如果可以设置变量意味着它们是类的属性,意味着它们应该在类定义中存在,我可能是错的但是根据代码设计我学到的对象不会决定要插入什么在课堂上,班级决定..
你可以有继承,如果你想要精确你可以有继承,在基类中包含所有必需的参数并且基于可选参数设计子类 ..
作为一个良好的代码设计问题,我永远不会在需求上定义属性。
答案 1 :(得分:1)
您可以动态添加公共字段,不需要先定义它们。
class MyClass
{
function __construct($params)
{
if(isset($params['var1']))
$this->var1 = $params['var1'];
if(isset($params['var2']))
$this->var1 = $params['var2'];
if(isset($params['var3']))
$this->var1 = $params['var3'];
}
}
或者您可以使用魔术方法__set
class MyClass {
protected static $allowed_fields = array('var1', 'var2', 'var3');
public function __construct($params) {
foreach ($params as $key => $value) {
if (in_array($key, self::$allowed_fields)) {
$this->$key = $value;
}
}
}
public function __set($key, $value) {
if (in_array($key, self::$allowed_fields)) {
$this->$key = $value;
} else {
throw new Exception("You can't set the field $key");
}
}
}
答案 2 :(得分:1)
这不对。当客户端使用您的类时,他们所知道的只是类名和接口。他们不会去代码看看需要什么参数。更好的方法是:
class MyClass
{
private $var1;
private $var2;
private $var3;
function __construct($var1 = null, $var2 = null, $var3 = null)
{
$this->var1 = $var1;
$this->var3 = $var2;
$this->var3 = $var3;
}
}
答案 3 :(得分:0)
您可以创建一个数组,只存储那些提交的值:
class MyClass
{
public $data = array();
function __construct($params)
{
if(isset($params['var1']))
$this->data['var1'] = $params['var1'];
if(isset($params['var2']))
$this->data['var2'] = $params['var2'];
if(isset($params['var3']))
$this->data['var3'] = $params['var3'];
}
}
通过这种方式,您可以随时查看具体的 已知 变量,以便获取所需的数据。
答案 4 :(得分:0)
看一下magic __set和__get方法。 http://php.net/manual/en/language.oop5.overloading.php
您可以将属性值存储在数组中,并使用__get和__set对它们进行服务/写入。
答案 5 :(得分:0)
我不喜欢整个概念。既然你要定义一个公共变量,那么整个点是什么。除非您阻止此操作,否则我们可以轻松地在类外部初始化一个公共变量,例如:
$obj = new classname();
$obj -> unknowpublicname = "somevaue";
无论你做什么,除非你限制一些规则,或改变访问修饰符,否则它没有任何区别。