Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 从对象访问对象_Php_Oop_Object - Fatal编程技术网

Php 从对象访问对象

Php 从对象访问对象,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中的OOP开始,我想做一些事情。让我举一个例子:

classes.php

<?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
实例化为class
a
,但它是一个全局变量,并且class
b
对它没有可见性。此外,对
$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();