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

在另一个(PHP)中调用先前定义的函数,php,function,user-defined-functions,nested-function,Php,Function,User Defined Functions,Nested Function,我一直在阅读关于是否需要嵌套函数的答案,但我仍然没有弄清楚1)为什么我的代码是错误的,2)如何修复它以使我所写的工作正常,或者修改脚本以使其更易于接受(对于解析器,但对于有经验的开发人员也是如此)。让我提一下,我是PHP OOP新手 这个想法是我想使用一个我以前在很多其他函数中定义的函数,这样我就不用每次重写代码了 下面是错误代码,它抛出了一个致命错误“调用未定义函数”,指向我在getMedia()中调用selectMediaIds()的那一行。。。(仅供参考,我故意省略了变量初始化、构造函数、

我一直在阅读关于是否需要嵌套函数的答案,但我仍然没有弄清楚1)为什么我的代码是错误的,2)如何修复它以使我所写的工作正常,或者修改脚本以使其更易于接受(对于解析器,但对于有经验的开发人员也是如此)。让我提一下,我是PHP OOP新手

这个想法是我想使用一个我以前在很多其他函数中定义的函数,这样我就不用每次重写代码了

下面是错误代码,它抛出了一个致命错误“调用未定义函数”,指向我在getMedia()中调用selectMediaIds()的那一行。。。(仅供参考,我故意省略了变量初始化、构造函数、getter、setter等,以使我的文章更加紧凑。)



谢谢你的回答

selectMediaID
在类
MediaManager
的范围内定义。这就是为什么它应该被命名为
$this->selectMediaIds()


在不定义作用域的情况下调用
selectMediaID
意味着作用域是全局的,您肯定没有定义
selectMediaID
函数。

selectMediaID
是在类
MediaManager
的作用域中定义的。这就是为什么它应该被命名为
$this->selectMediaIds()


调用
selectMediaIds
而不定义作用域意味着作用域是全局的,在这个作用域中,您肯定没有定义
selectMediaIds
函数。

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

您的问题是
selectMediaID
不是一个全局函数,而是类
MediaManager
的私有方法-它是该类的“一部分”,并且可以在神奇变量
$this
下引用该类的当前实例

为了调用这样一个方法,您必须使用
对象->方法
符号来调用它,因此您需要使用
$this->selectMediaID($object)
。这告诉PHP您想在特定对象
$this
内调用
selectMediaID
,您知道它是类
MediaManager
的一个实例


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

这与“嵌套”函数无关,从另一个函数调用一个函数以重用代码确实是首先使用函数的关键所在

您的问题是
selectMediaID
不是一个全局函数,而是类
MediaManager
的私有方法-它是该类的“一部分”,并且可以在神奇变量
$this
下引用该类的当前实例

为了调用这样一个方法,您必须使用
对象->方法
符号来调用它,因此您需要使用
$this->selectMediaID($object)
。这告诉PHP您想在特定对象
$this
内调用
selectMediaID
,您知道它是类
MediaManager
的一个实例


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

您正在调用对象中的方法,而不仅仅是函数;所以
$mediaIds=$this->selectMediaIds($object)
作为对编码风格的评论,在
->
()
之间加空格是不常见的;e、 g.
$req->fetch()通常会写入
$req->fetch()@MarkBaker:啊,无处不在的$this。。。我知道有一天它会让我p谢谢你的回答@IMSoP:before()之前的空格实际上是由我用于其他语言的IDE自动添加的(即C#或Eclipse中的MonoDevelop,我很少使用它…),所以我想在使用Notepad++编写PHP代码时也会这样做。之前和之后的->我只是简单地添加来协调整个项目(称我为傻瓜!)我将以这种方式完成这个项目,这样我的代码是统一的(我不想费心再次检查整个项目来消除所有不必要的空间),但我会记住你对下一个项目的建议!您正在调用对象中的方法,而不仅仅是函数;所以
$mediaIds=$this->selectMediaIds($object)
作为对编码风格的评论,在
->
()
之间加空格是不常见的;e、 g.
$req->fetch()通常会写入
$req->fetch()@MarkBaker:啊,无处不在的$this。。。我知道有一天它会让我p谢谢你的回答@IMSoP:before()之前的空格实际上是由我用于其他语言的IDE自动添加的(即C#或Eclipse中的MonoDevelop,我很少使用它…),所以我想在使用Notepad++编写PHP代码时也会这样做。之前和之后的->我只是简单地添加来协调整个项目(称我为傻瓜!)我将以这种方式完成这个项目,这样我的代码是统一的(我不想费心再次检查整个项目来消除所有不必要的空间),但我会记住你对下一个项目的建议!
<?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;
    }
}}?>