0

一开始我有 3 个 PHP 文件来处理 3 个不同的 AJAX 查询。

我决定创建一个独特的 PHP 类,在其中获取 $_POST 参数,然后调用 3 个函数中的 1 个。

我有另一个仅用于数据库查询的 PHP 类(base.php)。我将这个文件包含在用于获取 AJAX 查询 (ajax.php) 的类和我的 index.php 文件中。

首先,我写了这样的东西(ajax.php):

<?php
    new Ajax();

    class Ajax
    {
        private $base;

        public function __construct()
        {
            include("base.php");
            $this->base = new Base();

            $script = $_POST["script"];

            $reference = $_POST["reference"];

            if($script == "correct" || $script == "insert") {
                $ptGauche = json_decode($_POST["repGauche"]);
                $ptDroite = json_decode($_POST["repDroite"]);
            }
            if($script == "insert") {
                $txtGauche = json_decode($_POST["motGauche"]);
                $txtDroite = json_decode($_POST["motDroite"]);
            }

            switch($script)
            {
                case "correct":
                    $this->correct($reference, $ptGauche, $ptDroite);
                    break;
                case "insert":
                    $this->insert($reference, $ptGauche, $ptDroite, $txtGauche, $txtDroite);
                    break;
                case "delete":
                    $this->delete($reference);
                    break;
            }
        }

        private function correct($reference, $ptGauche, $ptDroite)
        {
            // code
            $query_result = $this->base->selectAllQuery($reference);
        }

        private function insert($reference, $ptGauche, $ptDroite, $txtGauche, $txtDroite)
        {
            //code
            $this->base->insertQuery($reference, $txtGauche, $txtDroite, $new_ptGauche, $new_ptDroite);
        }

        private function delete($reference)
        {
            //code
            $this->base->deleteQuery($reference);
        }
    }
?>

显然,这样做new Ajax();并且不将类实例保存在变量中并不是一个好主意,$ajax = new Ajax(); 例如没有变量的类实例 有人说将具有副作用的代码放在类构造函数中是不标准的__construct,也许我应该使用静态方法而不是使用构造函数创建对象并做类似的事情Ajax::functionToLoad();

这对我的脚本不起作用,因为我使用的是包含在这个脚本中的非静态类,所以我的属性private $base;应该是非静态的,并且不可能进行数据库查询,因为“静态函数无法访问非静态类”静态属性”:/ http://www.programmerinterview.com/index.php/c-cplusplus/can-static-function-access-non-static-members-of-class/

所以,我使用的是非静态方法,而不是使用构造函数,我这样做:

$ajax = new Ajax();
$ajax->loader();

class Ajax
{
    private $base;

    public function loader()
    {
        // code
    }

    // correct(), insert() and delete() functions
}

可以这样做还是我应该以其他方式进行?

4

2 回答 2

0

如果 __construct 不存在,公共函数 Ajax().... 是默认构造函数。所以使用 Ajax 而不是 loader 或者创建一个函数 Ajax 来执行 $this->loader();

于 2012-07-02T13:00:11.390 回答
0

你正在寻找的是一个单例

 <?php
class Ajax
{
    private static $inst = new Ajax();

    private $base;

    public static function getInstance(){
         return $inst;
    }

    public function __construct()
    {
        include("base.php");
        $this->base = new Base();

        $script = $_POST["script"];

        $reference = $_POST["reference"];

        if($script == "correct" || $script == "insert") {
            $ptGauche = json_decode($_POST["repGauche"]);
            $ptDroite = json_decode($_POST["repDroite"]);
        }
        if($script == "insert") {
            $txtGauche = json_decode($_POST["motGauche"]);
            $txtDroite = json_decode($_POST["motDroite"]);
        }

        switch($script)
        {
            case "correct":
                $this->correct($reference, $ptGauche, $ptDroite);
                break;
            case "insert":
                $this->insert($reference, $ptGauche, $ptDroite, $txtGauche, $txtDroite);
                break;
            case "delete":
                $this->delete($reference);
                break;
        }
    }

    private function correct($reference, $ptGauche, $ptDroite)
    {
        // code
        $query_result = $this->base->selectAllQuery($reference);
    }

    private function insert($reference, $ptGauche, $ptDroite, $txtGauche, $txtDroite)
    {
        //code
        $this->base->insertQuery($reference, $txtGauche, $txtDroite, $new_ptGauche, $new_ptDroite);
    }

    private function delete($reference)
    {
        //code
        $this->base->deleteQuery($reference);
    }
}
?>  

您现在应该可以按如下方式访问实例

 <?php
      $defaultInst = Ajax::getInstance();
 ?> 
于 2012-07-02T13:00:14.970 回答