我不确定我要找的是否有名字,所以我搜索有点困难,所以如果我之前已经回答过我的问题,我很抱歉。
情况是我有一个抽象类,当然还有很多其他扩展它的类。
抽象类中的抽象方法称为run()
,所有扩展类都定义了此方法。
我的问题是我想在调用run()
方法后调用一些公共代码,但我想知道是否有更好的方法来执行此操作。
我当然可以将我的公共代码粘贴到每个扩展类的run()
方法中,但如果我这样做,那么从那时起进行简单的更改对我来说将是很多工作。< / p>
我还可以将我的公共代码放入父类的方法中,然后使用run()
从扩展类的$this
方法调用if。
但我的问题是,有更好的方法可以做到这一点,还是我必须使用$this
关键字或将代码粘贴到每个类中?
以下是我想用现有想法做的一个小例子:
abstract class Parent_Class {
public abstract function run();
protected function common_code() {
// Common code here
}
}
class Child_Class {
public function run() {
// Code here
// I want some common code to run after the run method has been called
$this->common_code(); // Is this the best way to do it?
}
}
或者是否有可能以某种方式告诉班级何时调用run()
方法自动运行common_code()
方法?
答案 0 :(得分:2)
更简单的方法是简单地使用第三种方法调用run()
,然后调用common_code()
。然后,子类可以覆盖run()
所需的全部内容。
abstract class Parent_Class {
public abstract function run();
protected function common_code() {
// Common code here
}
protected function start() {
$this->run();
$this->common_code();
}
}
class Child_Class {
public function run() {
// Code here
}
}
答案 1 :(得分:1)
Amber给出的答案很简单。但是,您需要将数据放入run()
,但请致电start()
。这是一个替代方案,允许您在所有脚本中使用代码$a->run()
,并使用公共代码$a->run()
,但封装在命名空间中。
文件hooks.php
<?php
// File: hooks.php
namespace hook;
class processHooks {
public function __construct() { /* Fatal Error without constructor */ }
protected function processHooks($_c, $method, $args) {
/* Swap the next two callbacks to run your custom code after */
call_user_func_array("\hook\\{$_c}::{$method}", $args);
return call_user_func_array(array($_c,$method), $args);
}
}
class A {
public function foo() {
echo 'Doing code stuff BEFORE calling child function....<br>';
}
}
文件regular_file.php
<?php
// File: regular_file.php
include "hooks.php";
class A extends \hook\processHooks {
/* All that is required is this function
* and the function with common code to be protected
*/
public function __call($method, $args) {
self::processHooks(__CLASS__, $method, $args);
}
protected function foo() {
echo 'Method is called....<br>';
}
}
$a = new A();
$a->foo();
这是因为 regular_file.php 中的 f 类的方法 foo 受到保护,因此它不能在类外调用,所以调用它触发PHP魔术方法__call
在对象上下文中调用不可访问的方法时会触发__ call()。
答案 2 :(得分:1)
根据Bradley Forster的回答,您可以将方法定义为受保护,因此当从类外部调用它时,您可以使用php magic __call metod拦截事件,因为
在对象上下文中调用不可访问的方法时会触发__ call()。
然后你可以从__call函数
执行该方法class A {
public function __call($method, $args){
if(!method_exists($this, $method))
throw new Exception("Call to undefined method ".__CLASS__."::$method()");
echo "doing something BEFORE function 'run' execution\n";
$retval = call_user_func_array(array($this, $method), $args);
echo "doing something AFTER function 'run' execution\n";
return $retval;
}
protected function run() {
echo "function 'run' executed\n" ;
}
}
$a = new A;
$a->run();