这是我的班级:
class toyota extends car {
function drive() {
}
function break() {
}
}
class car {
function pre() {
}
}
我有什么方法可以这样做,当我运行$ car-> drive(),$ car-> break()(或丰田的任何其他功能)时,它会调用$ car-> pre ()在调用丰田的函数之前首先?
答案 0 :(得分:11)
是的。您可以使用protected
和一些__call
魔术:
class toyota extends car {
protected function drive() {
echo "drive\n";
}
protected function dobreak() {
echo "break\n";
}
}
class car {
public function __call($name, $args)
{
if (method_exists($this, $name)) {
$this->pre();
return call_user_func_array(array($this, $name), $args);
}
}
function pre() {
echo "pre\n";
}
}
$car = new toyota();
$car->drive();
$car->dobreak();
答案 1 :(得分:1)
您可以执行以下操作,但我认为这不是您想要的。
class toyota extends car {
function drive() {
$this->pre();
}
function break() {
$this->pre();
}
}
class car {
function pre() {
}
}
您可能希望了解PHP特定的魔术方法。 http://php.net/manual/en/language.oop5.magic.php
答案 2 :(得分:0)
使用名为__call()
的魔术方法可以做得更好public function __call($name, $arguments)
{
$this -> pre();
return $this -> $name($arguments);
}
这个方法是什么?它会覆盖默认方法调用,以便可以调用preCall
State。
您的toyota
班级
class toyota extends car {
public function __call($name, $arguments)
{
$this -> pre();
return call_user_func_array(array($this, $name), $arguments);
}
function drive() {
}
function break() {
}
}
答案 3 :(得分:0)
如果您使用的是PHP5(> = 5.3.2),则可以使用将所有方法声明为私有的解决方案。这将强制执行来自单个函数调用的方法调用:
exec_method()
代码段在这里:
<?php
class car {
//method to get class method
public function get_method($method_name) {
$class = new ReflectionClass(get_class($this));
$method = $class->getMethod($method_name);
$method->setAccessible(true);
return $method;
}
public function exec_method($method_name, $arg_args=array()) {
//execute the pre() function before the specified method
$this->pre();
//execute the specified method
$this->get_method($method_name)->invokeArgs($this, $arg_args);
}
public function pre() {
echo 'pre';
echo '<br />';
}
}
class toyota extends car {
private function drive() {
echo 'drive';
echo '<br />';
}
private function brake() {
echo 'brake';
echo '<br />';
}
}
$toyota = new toyota();
$toyota->exec_method('drive');
$toyota->exec_method('brake');
?>
参考:
Answer to Best practices to test protected methods with PHPUnit [closed]
答案 4 :(得分:-2)
只需添加constructor,就像这样......
class toyota extends car {
function __construct() {
$this->pre();
}
function drive() {
echo "drive!";
}
function dobreak() {
echo "break!";
}
}
class car {
function pre() {
echo "Hello!";
}
}
$car = new toyota();
$car->drive();
$car->dobreak();
具有构造函数方法的类在每个上调用此方法 新创建的对象,因此适用于任何初始化 在使用之前对象可能需要。
break
是保留的,因此您不应将其用作函数名称。