这些天我正在学习PHP。对不起,如果我的下面的查询看起来很蠢。
<?php
class A
{
var $parent;
var $app;
function A($parent) {
$this->parent = $parent;
if ($parent->isApplication()) {
$this->app = $parent;
} else {
$this->app = $parent->getApplication();
}
}
}
?>
<?php
class B extends A
{
private $app;
private $cfg;
public B() {
$this->app = parent::$app;
$this->cfg = $this->app->cfg;
}
}
?>
<?php
class C extends A {
function x(){ 新B($ this); //在某个地方打电话 } }
?>
如何在子类'B'中使用$this
,我知道我可以在某个函数中使用$ this,但我的目的是在该php文件中使用$ app,所以我试图创建$ app只是在类中,所以我可以在任何地方使用这个$ app变量,否则我会在某个函数中使用$ this。
以下是我的问题:
我怎样才能在课堂上使用$this->app
?
更新
<?php
class A
{
var $parent;
var $app;
function Canvas($parent) {
$this->parent = $parent;
if ($parent->isApplication()) {
$this->app = $parent;
} else {
$this->app = $parent->getApplication();
}
}
}
?>
<?php
class B extends A
{
private $app;
private $cfg;
public Canvas_Access_Approval() {
$this->app = parent::$app;
$this->cfg = $this->app->cfg;
}
}
?>
<?php
class C extends A {
function x(){
new B($this);
}
}
?>
获取错误: PHP解析错误:语法错误,意外“B”(T_STRING),期望变量(T_VARIABLE)
答案 0 :(得分:0)
您正在扩展A类,因此您将收到此父级的所有公共/受保护属性。这意味着:
class A {
public $app = 'test';
}
class B extends A {
public function get() {
echo $this->app;
}
}
new B; // test
或(但不必要):
class B extends A {
private $bApp;
public function __construct() {
echo $this->bApp = $this->app;
}
}
答案 1 :(得分:0)
类属性的默认值必须是文字,它不能引用任何变量或调用函数。如果要计算属性的默认值,则必须在构造函数方法中执行此操作:
class B extends A {
private $app;
private $cfg;
public function __construct() {
$this->app = parent::$app;
$this->cfg = $this->app->cfg;
}
}
请注意,您无法像$app
或$cfg
那样访问类属性,它们始终必须使用$this->
进行限定(当引用类中当前对象的属性时) )。
在$app
中声明B
并不是很重要,因为它会自动从A
继承$this->app
,因此您只需将{{1}}作为{{1}}访问,而无需另外声明
答案 2 :(得分:0)
你必须在A中声明$ app protected,然后它将对类和所有子类可见,但不在类之外。
class A {
protected $app;
}
class B extends A {
public function demo() {
$cfg = $this->app->config;
}
}