在另一个函数中调用先前定义的函数(PHP)

时间:2014-03-08 19:32:03

标签: php function user-defined-functions nested-function

我一直在阅读有关嵌套函数需求的问题的答案,但我仍然没有弄清楚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;
    }
}}?>

感谢您的回答!

2 个答案:

答案 0 :(得分:3)

这与“嵌套”函数无关,并且从另一个函数调用函数来重用代码确实是首先使用函数的重点。

您的问题是selectMediaIds不是全局函数,而是类MediaManager的私有方法 - 它是该类的“部分”,并且可以引用该类的当前实例魔术变量$this

要调用此类方法,您必须使用object->method表示法调用它,因此需要使用$this->selectMediaIds($object)。这告诉PHP您要在该特定对象selectMediaIds内调用$this,您知道该对象是类MediaManager的实例。

这与您在编写$req->fetch();

时使用数据库调用时的操作相同

答案 1 :(得分:1)

selectMediaIds在类MediaManager的范围内定义。这就是它应该作为$this->selectMediaIds()加入的原因。

调用selectMediaIds而不定义范围意味着范围是全局的,您肯定没有定义selectMediaIds函数。