1

ネストされた関数の必要性を疑問視するSOに関する回答を読んでいますが、1)コードが間違っている理由と2)書いたものを機能させるために修正する方法、またはスクリプトを変更する方法をまだ理解していませんより受け入れられます (パーサーだけでなく、経験豊富な開発者にも)。私はPHP OOPが初めてであることを述べさせてください...

アイデアは、以前に定義した関数を他の多くの関数で使用したいので、毎回コードを書き直す必要がありません。

getMedia () 内で selectMediaIds () を呼び出す行を指す致命的なエラー「未定義関数の呼び出し」をスローする欠陥のあるコードを次に示します... (参考までに、変数の初期化、コンストラクター、ゲッター、セッターを意図的に省略しました。 、などを使用して、投稿をよりコンパクトにします。)

<?php

class MediaManager {

private function selectMediaIds (MObject $object) {
    $medias = array ();
    $req = $this -> _db -> query ('SELECT media_idMedia FROM mObject_has_media WHERE mObject_idmObject = ' . $object -> id ());
    while ($data = $req -> fetch (PDO::FETCH_ASSOC)) {
        $medias[] = $data;
    }
    $req -> closeCursor ();
    return $medias;
}

public function getMedia (MObject $object) {
    $medias = array ();
    $mediaIds = selectMediaIds ($object);
    if ($mediaIds[0] != null) {
        foreach ($mediaIds as $id) {
            $req = $this -> _db -> query ('SELECT * FROM media WHERE idMedia = ' . $id);
            $req -> fetch ();
            $medias[] = $req;
            //$medias[] = new Media ($req);
        }
    return $medias;
    }
}}?>

ご回答ありがとうございます。

4

2 に答える 2

3

これは「ネストされた」関数とは関係ありません。別の関数を呼び出してコードを再利用することは、実際に関数を使用する最初のポイントです。

あなたの問題は、それselectMediaIdsがグローバル関数ではなく、クラスのプライベートメソッドであるMediaManagerことです-それはそのクラスの「一部」であり、クラスの現在のインスタンスを魔法の変数の下で参照できます$this

このようなメソッドを呼び出すには、object->method表記法を使用して呼び出す必要があるため、 を使用する必要があります$this->selectMediaIds($object)。これは、クラスのインスタンスであることがわかってselectMediaIdsいる特定のオブジェクト内で呼び出す必要があることを PHP に伝えます。$thisMediaManager

これは、書き込み時に DB 呼び出しで使用しているものと同じ操作です。$req->fetch();

于 2014-03-08T19:38:03.420 に答える
1

selectMediaIdsclass のスコープで定義されていますMediaManager。そのため、 としてアクセスする必要があります$this->selectMediaIds()

スコープを定義せずに呼び出すということは、スコープがグローバルであることを意味し、そこでは関数が定義されselectMediaIdsていません。selectMediaIds

于 2014-03-08T19:34:24.517 に答える