遗憾对于怪异的问题,但我不知道该如何表达它以另一种方式。
我试图从一个调用的类访问方法。 就像这个例子:
class normalClass {
public function someMethod() {
[...]
//this method shall access the doSomething method from superClass
}
}
class superClass {
public function __construct() {
$inst = new normalClass;
$inst->someMethod();
}
public function doSomething() {
//this method shall be be accessed by domeMethod form normalClass
}
}
两个类都没有继承关系,我不想要的功能设置为静态。
有没有什么办法来实现这一目标?
谢谢你的帮助!
你可以通过像这样的第一对象的引用:
class normalClass {
protected $superObject;
public function __construct(superClass $obj) {
$this->superObject = $obj;
}
public function someMethod() {
//this method shall access the doSomething method from superClass
$this->superObject->doSomething();
}
}
class superClass {
public function __construct() {
//provide normalClass with a reference to ourself
$inst = new normalClass($this);
$inst->someMethod();
}
public function doSomething() {
//this method shall be be accessed by domeMethod form normalClass
}
}
你可以为这个使用debug_backtrace()。 这是一个有点玄乎,但用于调试的目的是有用的。
class normalClass {
public function someMethod() {
$trace = debug_backtrace();
$trace[1]->object->doSomething();
}
}
您有几种选择。 您可以使用聚合像这样
class normalClass
{
protected $superClass;
public function __construct( superClass $superClass )
{
$this->superClass = $superClass;
}
public function someMethod()
{
$this->superClass->doSomething();
}
}
class superClass
{
public function __construct()
{
$inst = new normalClass( $this );
$inst->someMethod();
}
public function doSomething()
{ //this method shall be be accessed by domeMethod form normalClass
}
}
或者只是一个直线上升的二传手
class normalClass
{
protected $superClass;
public function setSuperClass( superClass $superClass )
{
$this->superClass = $superClass;
}
public function someMethod()
{
if ( !isset( $this->superClass ) )
{
throw new Exception( 'you must set a superclass' );
}
$this->superClass->doSomething();
}
}
class superClass
{
public function __construct()
{
$inst = new normalClass();
$inst->setSuperClass( $this );
$inst->someMethod();
}
public function doSomething()
{ //this method shall be be accessed by domeMethod form normalClass
}
}
根据你的使用情况,您可能希望实例传递到只有功能:
class normalClass {
public function someMethod($object) {
$object->doSomething();
}
}
如果normalClass::someMethod()
可以通过多个不同被称为$object
S,这可能是更好的选择(而不是提供的$object
到整个normalClass实例)。
但不管,你可能会考虑创建一个接口用于类型提示 :
interface ISomethingDoer {
public function doSomething();
}
class normalClass {
public function someMethod(ISomethingDoer $object) {
# Now PHP will generate an error if an $object is passed
# to this function which does not implement the above interface.
// ...
class superClass implements ISomethingDoer {
// ...
哇我比你同样的问题,但不是用这样简单的通过去参考的对象,我与事件管理器去了,基本上,当事情将在普通类发生,它会触发这是通过听取事件一类和所述类(听众)将调用超类来执行功能,并在必要时通过它新的论据。
不管怎么说,无论你把它作为参数传递给你的对象,或者你去一个基于事件的方法,这两种解决方案的工作。 选择你喜欢的一个。
有关事件的更多信息,交向解释了它相当不错。 http://symfony.com/doc/current/components/event_dispatcher/introduction.html