我有这些课程:
class User{
private $user_ID;
private $first_name;
private $surname;
...
private $website;
private $company;
function __construct($array){
$this->user_ID = $array["userId"];
$this->first_name = $array["first"];
$this->surname = $array["last"];
$this->telephone = $array["tele"];
...
}
public function addWebsite($array){
$this->website = $array;
}
public function addCompany($array){
$this->company = $array;
}
public function getData(){
$array = array();
foreach($this as $var => $value) {
$array[$var] = $value;
}
return $array;
}
}
class Website{
private $webId;
private $url;
private $description;
...
function __contruct($array){
$this->webId = $array["webId"];
$this->url = $array["url"];
$this->description = $array["desc"];
...
}
}
User中的getData()方法与Website类完全相同。
那么如何让网站类实现这个方法呢?但只有getData()方法
答案 0 :(得分:2)
如果您使用的是php5.4,则可以使用特征而不是类。它解决了你需要在两个不同类中实现一个方法的情况。
答案 1 :(得分:2)
虽然继承形成behaves-as relationship,但这不是继承的情况。您的Website
以任何方式与User
无关,因此它们之间不应存在关联。
在此处其他地方建议使用base classes会很快导致单片架构和god objects。那些反过来导致less maintainability, high coupling, fragile code and hampers reuse。同样地,将所有内容公之于众或诉诸于类似意味着破坏信息隐藏和扩大公共API会导致类似的问题,并且您将希望避免它们。
您正在寻找的是Traits
,但这些仅在PHP 5.4中受支持。最简单的方法就是在两个类中复制该方法。请记住,您通常希望避免代码重复,但在这种情况下,它比其他建议的替代方案更为邪恶。
一种可行的替代方法是使用Introspection Service,它使用Reflection将对象中的数据提取到数组中。虽然通常是you should put methods on the objects having the data the methods operate on。
答案 2 :(得分:1)
要使其成为类型保存,您可以定义一个接口,例如“arraySerializable”,它具有getData方法。您可以稍后在TypeHints中使用此界面,而不是类。
但是这仍然没有给你功能。我想一个共同的基类不是你想要的东西。因此,如果您不能使用特征,则必须复制代码。这可能是一些极少数情况下,某些行重复代码就可以了。
答案 3 :(得分:0)
创建另一个只有getData方法的类,并使两个现有类扩展该新类。
答案 4 :(得分:0)
如果您没有Traits,可以使用较旧的Mixins实现。
您可能知道:
<?php
class A {
public function B() {
var_dump($this->data);
}
}
class X {
protected $data;
public function Y() {
A::B()
}
}
$x = new X;
$x->Y(); // will execute the code for A::B
// but will assume the object context
// of $x (of class X) and will have
// access to $this->data
// ! this is not a static call
使用此原则,您可以创建一个类名称和/或方法名称的静态数组,您可以通过魔术方法__get“混合”或“使用”(如特征)。 ?&GT;
答案 5 :(得分:-2)
与其他回答者相反,我认为我应该评论你的设计。您想要创建一个公开任何对象的所有私有属性的方法。在大多数情况下,对象不仅仅是一个属性包,所以在什么情况下你需要知道所有属性?那你为什么把它们标记为私人?
要解决实际问题,您应该查看公共属性,或者如果要控制传入和传出数据,请查看具有getter和setter的私有属性。
如果你认为你需要给定对象的所有属性(并且愿意接受像乱码编程,特征和诸如此类的“hacks”),为什么不简单地将它们标记为公共并调用get_object_vars()
?< / p>