我是PHP的新手,刚进入OOP。我有几个通用方法来设置和获取属性。我几乎在所有类中都经常使用它们,我将这些方法放在一个类中并从中扩展其他类。现在我可以从子类访问方法,但不知道如何通过它们设置和获取子类的属性......父类库.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;
}
}
子类类别.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')));
这里几乎不需要指导。如果这是正确的方法?或者至少可以这样做吗?如果是这样,如何完成此操作...谢谢
扩展类是你只想做的事情,当你可以说类categories
是一个类Base
.像你在那里拥有的那种实用程序类几乎总是错误的方式。PHP 还引入了一种称为复制/粘贴代码的特征的东西。然而,我个人的偏好是,它是你永远不想使用的东西,因为它将特质与你的类紧密结合,这是你想要避免的。
有关更多信息,请参阅 SOLID 编程中的 Liskov 替换原则。
如果由我决定,我会避免那些魔术获取者/二传手,而只是将您自己的获取者/二传手方法添加到类中。
关于某些基类的错误不仅仅是你自己在做的事情(甚至我过去也做过)。想想一些班级Database
和一个班级Article
。由于 Article
类需要访问数据库,因此许多人允许该类扩展Database
类。这是不正确的,因为文章不是数据库。相反,应使用依赖关系注入将数据库类的实例注入到项目类中。实例应注入到类构造函数中(如果所有或许多方法都需要访问它),或者只注入需要它的方法。因此,在扩展类时,您必须能够说类 B 是类 A。
关于代码的其他一些说明:
- 始终将类名命名为 PascalCase。这实际上并不是使代码正常工作所必需的,但它遵循经常使用的命名约定。
- 我个人的偏好是:请始终在您的 foreach 语句中添加大括号。当其他人阅读您的代码时,会发生什么更清楚。