1

我一直在阅读关于 SO 质疑嵌套函数的必要性的答案,但我仍然没有弄清楚 1)为什么我的代码是错误的,以及 2)我如何修复它以使我写的东西工作或更改我的脚本所以它是更容易接受(解析器和有经验的开发人员)。让我提一下,我是 PHP OOP 的新手......

我的想法是我想使用一个我之前在很多其他函数中定义的函数,所以它可以节省我每次重写代码的时间。

那么,这是错误代码,它会引发致命错误“调用未定义函数”,指向我在 getMedia () 中调用 selectMediaIds () 的行...(仅供参考,我故意省略了变量初始化、构造函数、getter、setter等,以使我的帖子更紧凑。)

<?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). 这告诉 PHP 你想selectMediaIds在那个特定的对象中调用$this,你知道它是一个类的实例MediaManager

这与您在编写时用于 DB 调用的操作相同$req->fetch();

于 2014-03-08T19:38:03.420 回答
1

selectMediaIds在 class 的范围内定义MediaManager。这就是为什么它应该被访问为$this->selectMediaIds().

不定义作用域的调用selectMediaIds意味着作用域是全局的,你肯定没有selectMediaIds定义函数。

于 2014-03-08T19:34:24.517 回答