调用类方法时出现“未定义的函数”错误

49

这是错误信息:Fatal error: Call to undefined function assign(
这是代码,你可以看到我明显已经定义了这个函数,为什么它还是不能工作呢?

class shades {
    function create($name, $shades, $slug, $shortDesc, $longDesc, $position){
        $name = sanitize_paranoid_string($name);
        $slug = slug($name);
        $shortDesc = sanitize_sql_string($shortDesc);
        $longDesc = sanitize_sql_string($longDesc);
        $query = mysql_query("INSERT INTO products (type, name, slug, shortDesc, htmlDesc, position)VALUES('shades','$name','$slug','$shortDesc','$longDesc','$position')")or die(mysql_error());  
        $ID = mysql_insert_id();
        assign($shades, $ID);
        if($query) {return true;}
        else {return false;};
    }
    function delassign($toID){
        mysql_query("DELETE FROM assign WHERE type='shades' AND toID='$toID'")or die(mysql_error());    
    }
    function assign($shades, $toID)
    {
        foreach($shades as $shade)
        {
            $result = mysql_query("INSERT INTO assign(type, typeID, toID)VALUES('shades','$shade','$toID')")or die(mysql_error());
            if($result){echo "Added!";}
            else{echo"Not Added!";}
        };  
    }
}

4
函数 delassign 中的样本代码可能存在 SQL 注入 的漏洞。为了修补这个漏洞,需要从过时的 mysql 驱动程序切换到 PDO,并使用 预处理语句。请注意,这比显式的净化更好,因为虽然您可能会忘记净化,但是在准备好的语句参数方面,安全方面没有什么可以遗忘的(如果您忘记一个参数,PHP 将生成一个错误通知您)。 - outis
2
如果您需要PDO教程,请尝试阅读《使用PHP和PDO编写MySQL脚本》(http://www.kitebird.com/articles/php-pdo.html)。 - outis
4个回答

108

你没有名为assign()的函数,但有一个名为该名称的方法。PHP不是Java,在PHP中你必须明确表明你想要调用一个函数。

assign()
或者一个方法。
$object->assign()
在您的情况下,调用该函数的代码位于另一个方法内部。$this始终引用包含该方法的对象本身。
$this->assign()

1
那么,以关键字“function”开头的PHP类方法定义实际上不是一个函数?需要使用$this->来调用它似乎与不必预定义返回类型(甚至没有显式返回值)不一致(在我看来)。 - mpag
PHP中的关键字“function”用于函数、方法和过程(更新:“和闭包”)。它可能是一个真正的函数,这取决于上下文。我不明白$this->和返回类型之间的关系应该是什么。返回类型是相当新的(至少与此答案相比;)而且PHP仍然是弱类型的。类型声明不是必需的。 - KingCrunch

17

你需要像这样调用函数

$this->assign()

使用assign()代替简单的赋值操作


4

伙计们,

今天在测试一个简单脚本时,我遇到了这个错误。虽然我没有使用“class”函数,但还是需要注意一下。 我在函数定义之前调用该函数,类似于这样:

      try{
             foo();
         }
       catch (exception $e)
           {
            echo "$e->getMessage()";
           }

       function foo(){
                       echo "blah blah blah";
                     }

因此,PHP给我抛出了一个“调用未定义的函数”的错误。

这似乎是一种经典的编程错误,但它可能会帮助需要提示的人。


0

你可能会犯的另一个愚蠢错误是将递归函数从非类环境复制到类中,但不更改内部self调用为$this->method_name()。

我写这篇文章是因为我曾经不理解为什么会出现这个错误,而当你搜索这个错误时,这篇文章是谷歌上排名第一的。


我写这篇文章是因为我不明白为什么会出现这个错误,而这篇帖子是谷歌搜索结果的第一篇。这真的很聪明。谢谢。 - Ace Thanks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接