2013-02-17 98 views
0

我想知道是否有任何好的做法,以Ajax的方式从Javascript类中调用方法。在javascript中调用php类函数(ajax)

这是我现在的“样式”来执行它。

(类中的方法,这里只是举例)

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总是在我的班级中,我很确定这不是正确的做法,我在这里找到了帮助。

感谢您提前

西蒙

+0

你认为应该发生什么,而发生什么呢?此外,尝试将类声明放在最前面。 – gd1 2013-02-17 22:01:45

+0

这个想法是有一个更“优雅”的方式来做到这一点。这种方法完美地工作,但是,我不知道我是否想要像这样使用它。一切都按照我想要的方式返回,但我想要找到“良好实践”的方式:) – Simon 2013-02-17 22:13:51

+0

我看到的唯一'问题'是有人可以从外部调用你的课程的任意方法。如果你的课程只包含“安全”方法,那就没有问题了。而且,我不喜欢对$ _POST变量使用extract()。 – gd1 2013-02-17 22:17:43

回答

0

的问题是,这并不容易调用基于字符串请求范围,namings。 您可以使用称为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

你可能甚至不需要再类用这种方法,但只是显示。