我从PHP开始使用OOP,我想做点什么。让我举个例子:
classes.php
<?php
class a {
public function a() {
echo 'a';
}
}
class b {
public function calla() {
$x->a();
}
}
?>
的index.php
<?php
include('classes.php');
$x = new a();
$d = new b();
$d->calla();
?>
这可能吗?我知道我可以这样做:
class b {
public function calla($object) {
$object->a();
}
}
和
$d->calla($x);
但是第一个可能的例子吗?
答案 0 :(得分:0)
我想我明白你要问的是什么,但是你将参数可见性概念与在类方法中传递的对象混合在一起。所以,让我们清理......
在classes.php文件中,类b的方法calla()
与类a
完全无关,除非$x
本身是类{{1}的实例}。
在index.php文件中,您将a
实例化为类$x
,但它是一个全局变量,而类a
对它没有可见性。此外,您对b
的调用将返回错误,因为您正在从外部访问私有方法。
您的第三个示例更接近解决方案,将实例传递给$d->calla()
方法帮助类calla()
查看类b
的实例,我想您要编辑索引。 php文件到:
a
但是,在将私有方法更改为公共方法之前,这仍然无效。
答案 1 :(得分:0)
所以你想用$x
作为全局变量?语法是相同的,对象与否:
class b {
public function calla() {
$GLOBALS['x']->a();
}
}
......或:
class b {
public function calla() {
global $x;
$x->a();
}
}
当然,这是一个可怕的设计,注入难以跟踪依赖性,可能会导致意想不到的副作用和头疼。
此外,a()
是类a
的一个糟糕的方法名称,因为它是构造函数的PHP 4语法。如果您运行此代码:
<?php
class a {
public function a() {
echo 'a';
}
}
class b {
public function calla() {
$GLOBALS['x']->a();
}
}
$x = new a();
$d = new b();
$d->calla();
...你会看到a()
运行两次。猜猜为什么?