Sha*_*hah 3 php oop inheritance
我是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;
}
}
Run Code Online (Sandbox Code Playgroud)
子类category.php
class categories extends Base
{
private $id;
private $pid;
private $title;
private $status;
public function __construct()
{
parent::__construct();
}
}
Run Code Online (Sandbox Code Playgroud)
我称之为
$objCat = new categories();
$objCat->setProperties(array('id'=>'10', 'pid'=>'6'));
print_r( $objCat->getProperties(array('id', 'pid')));
Run Code Online (Sandbox Code Playgroud)
这里需要一些指导.如果它是正确的方式?或者至少可以这样做吗?如果是这样的话怎么做...谢谢
扩展一个类是你唯一想做的事时,你可以说一些类categories是一类Base.像你所拥有的那种实用类似的东西几乎总是错误的方式.PHP也有推出一些所谓的特质复制/粘贴代码.然而,我个人的偏好是,它是你永远不会想要使用的东西,因为它将特质与你的课程紧密结合,这是你想要避免的.
更多信息请参见该Liskov替换原则,以扎实的编程.
如果由我决定,我会以任何方式避免那些神奇的getter/setter,只需在课堂上添加你自己的getter/setters方法.
一些基类的错误不是你正在做的事情(即使我过去也做过).想想一些班级Database和班级Article.因为Article类需要访问数据库,所以很多人都让类扩展了Database类.这是不正确的,因为文章不是数据库.而是应该使用依赖注入将数据库类的实例注入到文章类中.应该将实例注入到类构造函数中(如果所有或许多方法都需要访问它)或者只需要注入需要它的方法.因此,在扩展课程时,您必须能够说B类是A类.
关于您的代码的一些其他说明: