0

私は PHP で OOP を始めていますが、やりたいことがあります。例を示しましょう:

クラス.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);

しかし、最初の例は可能ですか?

4

2 に答える 2

0

$xそれで、グローバル変数として使いたいですか?オブジェクトであろうとなかろうと、構文は同じです。

class b {
    public function calla() {
        $GLOBALS['x']->a();
    }
}

... また:

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

もちろん、これは追跡しにくい依存関係を注入する恐ろしい設計であり、おそらく予期しない副作用や頭を悩ませる原因となるでしょう。

さらに、コンストラクターの PHP 4 構文であるためa()、クラスのメソッド名としては不適切です。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();

a()... 2 回実行されることがわかります。なぜだと思いますか?

于 2013-02-15T16:40:28.700 に答える
0

あなたが尋ねようとしていることは理解していると思いますが、パラメーターの可視性の概念とクラスメソッドで渡すオブジェクトを混同しています。じゃあ掃除しよう…

あなたの classes.php ファイルでは、クラス b のメソッドは、それ自体が class のインスタンスでない限りcalla()、 class とはまったく関係ありません。a$xa

index.php ファイル$xで class としてインスタンス化しますaが、これはグローバル変数であり、クラスbには可視性がありません。$d->calla()さらに、外部からプライベート メソッドにアクセスしているため、 への呼び出しはエラーを返します。

3 番目の例は解決策に近づきます。インスタンスをメソッドに渡すと、クラスが class のインスタンスを検出するのにcalla()役立ちます。 index.php ファイルを次のように編集する必要があると思います。ba

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

ただし、これは、プライベート メソッドをパブリック メソッドに変更するまで機能しません。

于 2013-02-15T16:37:35.867 に答える