我是PHP新手,刚进入OOP。我有几个用于设置和获取属性的泛型方法。我几乎在所有类中经常使用它们,我将这些方法放在一个类中并从中扩展其他类。现在我可以从子类访问方法,但不知道如何通过它们设置和获取子类的属性... parent class base.php
class Base
{
public function __construct()
{
}
function __set($propName, $propValue)
{
$this->$propName = $propValue;
}
function setProperties(array $data)
{
foreach($data as $propName => $propValue)
$this->$propName = $propValue;
}
function __get($propName)
{
return (isset($this->$propName))? $this->$propName : "Invalid property!";
}
function getProperties(array $properties)
{
foreach($properties as $propName)
$propVals[$propName] = $this->$propName;
return $propVals;
}
}
子类category.php
class categories extends Base
{
private $id;
private $pid;
private $title;
private $status;
public function __construct()
{
parent::__construct();
}
}
我称之为
$objCat = new categories();
$objCat->setProperties(array('id'=>'10', 'pid'=>'6'));
print_r( $objCat->getProperties(array('id', 'pid')));
这里需要的指导很少。如果它是正确的方式?或者至少可以这样做吗?如果是这样的话怎么做... 感谢
答案 0 :(得分:6)
当您可以说课程categories
是班级Base
时,您只想扩展班级。像你所拥有的那种实用类似的东西几乎总是错误的方式。 PHP还为复制/粘贴代码引入了一个名为traits的东西。然而,我个人的偏好是,这是你永远不会想要使用的东西,因为它将特质与你的课程紧密结合,这是你想要避免的。
有关详情,请参阅Liskov Substitution principle中的SOLID programming。
如果由我决定,我会以任何方式避免那些神奇的getter / setter,只需在课堂上添加你自己的getter / setters方法。
关于某些基类的错误不仅仅是你正在做的事情(即使我过去也曾这样做过)。考虑一些课程Database
和课程Article
。因为Article
类需要访问数据库,所以很多人都让类扩展Database
类。这是不正确的,因为文章不是数据库。相反,应使用dependency injection将数据库类的实例注入到文章类中。应该将实例注入到类构造函数中(如果所有或许多方法都需要访问它)或者只需要注入需要它的方法。因此,在扩展课程时,您必须能够说B类是A类。
关于您的代码的其他一些说明: