我有大班foo
,我想分成两个单独的类(和文件);
我的班级foo
使用contruct函数和noumerous $this
引用。
我需要第二个班级bar
作为原始foo
班级的扩展,因此如果要包含bar
类,我仍然可以使用带有附加参数的构造;
$includeBar = true;
$foo = new foo($config, $includeBar);
我试过这样说:
Class bar extends foo {
public function barFunction(){
//some function of bar
}
}
Class foo {
public function __construct($config, $includeBar = true) {
if ($includeBar) {
include_once 'bar.php';
}
}
}
但是当我打电话时:
$foo = new foo($config, true);
$foo->barFunction();
它失败了,说
PHP Fatal error: Uncaught Error: Call to undefined method foo::barFunction()
我做错了什么?请帮忙,卡住了
答案 0 :(得分:2)
反过来应该是相反的 Bar是您的基类,它包含每个子类也需要的所有方法。 Foo是扩展,额外的,所以Foo扩展了Bar。
<?php
// file bar.php
Class Bar {
public function __construct($config) {
$this->config = $config;
}
public function barFunction() {
echo "I'm everybody ".$this->config['msg'];
}
}
// file foo.php
require_once('bar.php');
Class Foo extends Bar {
public function fooOnly() {
echo "I'm foo ".$this->config['msg'];
}
}
// consuming file index.php
include('foo.php');
$config = array('msg'=>'and I need coffee');
$foo = new foo($config);
$foo->barFunction(); // we can call this, because foo extends bar
// this won't work:
$bar = new Bar($config);
$bar->fooOnly();
// but this:
$bar->barFunction();
$foo->fooOnly();
(使用合适的自动加载器时,可以省略所有包含/要求!)
答案 1 :(得分:0)
如果您想要重用类方法或单独的类方法实现,我认为您可以使用trait,然后您可以使用关键字use
来为您的类提供函数。
例如:
<?php
class Base {
public function sayHello() {
echo 'Hello ';
}
}
trait SayWorld {
public function sayHello() {
parent::sayHello();
echo 'World!';
}
}
class MyHelloWorld extends Base {
use SayWorld;
}
$o = new MyHelloWorld();
$o->sayHello();
?>
以上示例将输出:
Hello World!