好的 - 我正在尝试做的事情有点令人费解,我不确定它是否可能或者是否有其他“正确”的方法来做到这一点但是这里简单来说:
class foo {
var $testvar = "foo";
function doTest() {
echo $this->testvar . "\n";
$t = new bar;
$t->updateParent();
echo $this->testvar;
}
}
class bar extends foo {
function updateParent() {
$this->testvar = "bar";
}
}
/*
What I get:
foo
foo
What I want:
foo
bar
*/
我这样做的原因是我正在设计一个模板引擎,基本上我的目的是foo类是拥有大量应用程序代码的主类。系统的设计使用户可以创建自己的模板php文件,这些文件由应用程序在foo方法的上下文中加载。我想将foo的所有属性和方法设置为私有保存,以保存某些将被保护并因此可以访问的条件。关键是我希望用户模板php代码在我包含他们的代码时只能访问父类的有限数量的函数。
更好的例子是:
class foo {
protected $db;
private $settings;
function SomeAction() {
// some code that results in a template needing to be loaded
// code that determines the template file
$template = new bar;
$template->loadTemplate($file);
}
}
class bar extends foo {
function loadTemplate($file) {
//if file exists
require($file);
// has access $db driver class (without creating a new instance of it)
// does not have access to the $settings property
}
}
任何想法?
答案 0 :(得分:1)
我觉得你扩展foo
课只是为了提供$db
的访问权限可能会有更多属性。但这对我没有意义。您应该将依赖项传递给这两个类。
class foo {
protected $db;
private $settings;
function SomeAction(bar $bar) {
// some code that results in a template needing to be loaded
// code that determines the template file
$bar->loadTemplate($file);
}
}
class bar {
function loadTemplate($file, Gateway $db) {
// use $db here
//if file exists
require($file);
}
}
答案 1 :(得分:0)
我相信你正在寻找parent
尝试一下:
class foo {
var $testvar = "foo";
function doTest() {
echo $this->testvar . "\n";
$t = new bar;
$t->updateParent();
echo $this->testvar;
}
}
class bar extends foo {
function updateParent() {
parent::testvar = "bar";
}
}
/*
What I get:
foo
foo
What I want:
foo
bar
*/
答案 2 :(得分:0)
试试这个
<?php
class foo {
var $testvar = "foo";
function doTest() {
echo $this->testvar . "\n";
$R =$this->updateParent();
echo $R;
}
}
class bar extends foo {
function __construct()
{
parent:: doTest();
}
function updateParent() {
$testvar = "bar";
return $testvar;
}
}
$t = new bar;
您应该使用特殊名称parent
,而不是在代码中使用基类的文字名称,它指的是类的扩展声明中给出的基类名称
答案 3 :(得分:0)
每个对象实例也是它的父实例。 您在父级中将所有属性设为私有,并通过公共方法提供安全访问。所有公共方法都可以用于子类,就像它们自己的一样,无法访问私有属性。
class foo {
private $db;
public function dbSelect() {
return $this->db->select();// Example
}
}
class bar extends foo {
public function loadTemplate($file) {
require($file);
$selected = $this->dbSelect();
}
}