Php 从对象访问对象
我从PHP中的OOP开始,我想做一些事情。让我举一个例子: classes.phpPhp 从对象访问对象,php,oop,object,Php,Oop,Object,我从PHP中的OOP开始,我想做一些事情。让我举一个例子: classes.php <?php class a { public function a() { echo 'a'; } } class b { public function calla() { $x->a(); } } ?> 及 但是第一个例子可以吗?我想我理解你想问
<?php
class a {
public function a() {
echo 'a';
}
}
class b {
public function calla() {
$x->a();
}
}
?>
及
但是第一个例子可以吗?我想我理解你想问的问题,但是你把参数可见性概念和类方法中的对象传递混淆了。所以让我们清理一下 在classes.php文件中,类b的方法
calla()
与类a
完全无关,除非$x
本身是类a
的实例
在index.php文件中,您将$x
实例化为classa
,但它是一个全局变量,并且classb
对它没有可见性。此外,对$d->calla()
的调用将返回一个错误,因为您正在从外部访问私有方法
您的第三个示例更接近解决方案,将实例传递给calla()
方法有助于类b
seing类a
的实例,我猜您希望编辑index.php文件以:
<?php
include('class.php');
$x = new a();
$d = new b();
$d->calla($x);
?>
但是,在将私有方法更改为公共方法之前,这仍然不起作用。那么您想使用
$x
作为全局变量吗?语法是否相同,对象是否相同:
class b {
public function calla() {
$GLOBALS['x']->a();
}
}
。。。或:
class b {
public function calla() {
global $x;
$x->a();
}
}
当然,这是一个可怕的设计,注入难以跟踪的依赖项,可能会导致意想不到的副作用和头痛
另外,a()
对于类a
来说是一个糟糕的方法名,因为它是构造函数的PHP4语法。如果运行此代码:
<?php
class a {
public function a() {
echo 'a';
}
}
class b {
public function calla() {
$GLOBALS['x']->a();
}
}
$x = new a();
$d = new b();
$d->calla();
private
的唯一目的就是防止这种情况发生。public
是一个选项吗?那根本行不通。你用的是什么版本的PHP?对不起,我打错了。这将是一个公共函数。您需要像您的公共函数calla($object){
示例那样传递对象。或者您可以从类b
中全局地声明$x
,但这不是一个好主意。我错误地键入了private,它本来是公共的。我知道我可以调用$d->calla()如果对象$x不存在,它会抛出一个错误。我问这个问题的原因是因为我正在通过一个类启动和查询一个mysql数据库,我希望所有其他类都能够使用这个对象($db)要查询数据库,无需在每个类中创建对象或通过函数传递。您可以在类方法中使用全局($x)使$x在内部范围中可见,然后…:)全局是我想要的。谢谢。我也不知道方法的命名,谢谢提示。
class b {
public function calla() {
$GLOBALS['x']->a();
}
}
class b {
public function calla() {
global $x;
$x->a();
}
}
<?php
class a {
public function a() {
echo 'a';
}
}
class b {
public function calla() {
$GLOBALS['x']->a();
}
}
$x = new a();
$d = new b();
$d->calla();