【问题标题】:Calling php class function in javascript (ajax)在javascript(ajax)中调用php类函数
【发布时间】:2013-02-02 06:54:18
【问题描述】:

我想知道是否有什么好的做法可以通过 Ajax 从 php 类中调用方法。

这是我目前执行它的“风格”。

(类中的方法仅在这里举例)

PHP端:

<?php

if(isset($_POST['action']) && $_POST['action'] != null)
{
    extract($_POST);

    if($action)
    {
        $ajaxCommand = new EleveUpdate();

        if(method_exists($ajaxCommand, $action))
        {
            $reponse = call_user_func(array($ajaxCommand, $action),$_POST);
            echo $reponse;
            exit(0);
        }
        else 
        {
            throw new Exception("Cette méthode n'existe pas");
        }
    }
}
else
{
    echo 'Cette action n\'est pas autorisée';
    return false;
}

class EleveUpdate
{

    public function __construct()
    {

    }

    public function testfunct($data)
    {
        echo $data['eleve'];
    }
}

Javascript 方面:

$(document).ready(function() {
    $.ajax({
        url: 'eleveupdate.php',
        type: 'POST',
        data: {
          action: "testfunct",
          eleve: 1
        },
        beforeSend: function()
        {
            loading(true);
        },
        error: function()
        {
            console.log('error');
        },
        success: function(data) 
        {
            loading(false);
            console.log(data);
        }
    });
});

问题是 isset $_POST 总是在我的课堂上,我很确定这不是正确的做法,我在这里寻求帮助。

提前谢谢你

西蒙

【问题讨论】:

  • 你认为它应该发生什么,而不发生什么?此外,尝试将类声明移到顶部。
  • 这个想法是有一个更“优雅”的方式来做到这一点。这种方法效果很好,但是我不知道我是否想这样使用它。一切都按我的意愿返回,但我想找到“良好做法”的方式:)
  • 我看到的唯一“问题”是有人可以从外部调用您类的任意方法。如果您的类仅包含“安全”方法,则没有问题。此外,我不喜欢将 extract() 用于 $_POST 变量。
  • 在这种情况下使用提取物是一种“坏方法”吗? (这是我自己的信息:))
  • 想象一个场景,你使用一个变量来表示某人具有像“管理员”这样的特殊能力,而你的代码说 if ($admin == true) blah blah。通过使用 extract(),某人可以将 admin=1 放入 AJAX 调用并成为管理员,因为 extract 从 URL 中获取值并用它替换了一个局部变量。

标签: php javascript jquery ajax class


【解决方案1】:

问题是基于字符串请求调用范围命名并不容易。 您可以使用称为 LAMBDA 或匿名函数的东西。通过这种方式,您可以存储一个带有 LAMBDA 的字符串数组。像这样:

<?php
class EleveUpdate {
    private $funcs = array();

    function __construct($which_function) {
        $funcs['testfunct'] = create_function('$a,$b', 'return "ln($a) + ln($b) = " . log($a * $b);');

        $funcs[$which_function];
    }
}
?>

在此处查看更多信息:http://www.php.net/manual/en/function.create-function.php

使用此方法,您甚至可能不再需要 Class,而只是显示。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-19
    • 1970-01-01
    • 2014-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-19
    • 1970-01-01
    相关资源
    最近更新 更多