从对象访问对象

时间:2013-02-15 16:26:46

标签: php oop object

我从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);

但是第一个可能的例子吗?

2 个答案:

答案 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()运行两次。猜猜为什么?

相关问题