0

我从 PHP 中的 OOP 开始,我想做一些事情。让我举个例子:

类.php

<?php
    class a {
        public function a() {
            echo 'a';
        }
    }

    class b {
        public function calla() {
            $x->a();
        }
    }
?>

索引.php

<?php
    include('classes.php');
    $x = new a();
    $d = new b();
    $d->calla();
?>

这可能吗?我知道我可以做类似的事情:

class b {
        public function calla($object) {
            $object->a();
        }
    }

$d->calla($x);

但是第一个例子可以吗?

4

2 回答 2

0

我想我理解您要问的问题,但是您将参数可见性概念与类方法中的对象传递混为一谈。所以,让我们清理...

在您的 classes.php 文件calla()中,类 b 的方法与类完全无关a,除非$x它本身是类的实例a

在您的 index.php 文件中,您将其实例$x化为 class a,但它是一个全局变量,并且该类b对它没有可见性。此外,您的调用$d->calla()将返回错误,因为您正在从外部访问私有方法。

您的第三个示例更接近解决方案,将实例传递给calla()方法有助于类b查看 class 的实例a,我猜您想将 index.php 文件编辑为:

<?php
include('class.php');
$x = new a();
$d = new b();
$d->calla($x);
?>

但这仍然行不通,直到您将私有方法更改为公共方法。

于 2013-02-15T16:37:35.867 回答
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()运行了两次。猜猜为什么?

于 2013-02-15T16:40:28.700 回答