我最终得到了一个解决方案,其中我有两个层次的类。第一个(Greeters)层次结构中的类使用第二个类(用户)中的类。
继承人前:
class User {}
class Admin extends User {
function getSecretMessage() {
return "secret";
}
}
class Greeter {
public function hello(User $a) {
echo "hello!";
}
}
class AdminGreeter extends Greeter {
public function hello(Admin $a) {
parent::hello($a);
echo "in addition heres a secret of mine: " . $a->getSecretMessage();
}
}
这里我有User和Greeter,在PHP中我收到错误(严格)
“AdminGreeter :: hello声明必须与Greeter :: hello兼容”
我希望AdminGreeter::hello
只使用来自更专业的类(管理员)的数据“扩展”Greeter::hello
。
我有什么其他选择来构建类似的PHP?
我想主要的问题是PHP不支持“方法重载”,因此如果我要将User
实例发送到AdminGreeter
它会中断。但是如果我有“方法重载”,如果在User实例中传递,则只会调用Greeter::hello
。
这可能是整体糟糕的设计,因为我最终遇到了这个问题,也许有人可以指出我为这个问题更好的设计。
正如我所说,我在开发Objective-C
时似乎有同样的问题答案 0 :(得分:0)
也许您可以考虑使用Traits代替这些“专门课程”
class User {
protected $name;
public function __construct($name) {
$this->name = $name;
}
public function __toString() {
return $this->name;
}
}
trait Admin {
function getSecretMessage() {
return "secret";
}
}
class Greeter {
public function hello(User $a) {
echo "Hello ", $a, "!", PHP_EOL;
}
}
class AdminGreeter extends Greeter {
use Admin;
public function hello(User $a) {
parent::hello($a);
echo "in addition heres a secret of mine: " . $this->getSecretMessage();
}
}
$x = new User('Natalie');
$y = new AdminGreeter;
$y->hello($x);
答案 1 :(得分:0)
尽可能保持原始代码:
interface iUser {
public function getSecretMessage();
}
class Admin implements iUser {
function getSecretMessage() {
return 'secrete';
}
}
class Greeter implements iUser{
public function hello( iUser $a ) {
echo 'hello';
}
public function getSecretMessage(){}
}
class AdminGreeter extends Greeter {
public function hello( iUser $a ) {
parent::hello($a);
echo ' in addition heres a secrete of mine: ' . $a->getSecretMessage();
}
}
AdminGreeter::hello( new Admin );
输出hello in addition heres a secrete of mine: secrete