PHP创建类的新实例返回NULL


PHP Creating New Instance of a Class Returns NULL

作为学校项目的一部分,我目前正在创建一个非常简单的在线订购网站。我遇到了一个问题,我的控制器试图创建一个与我的订单参数接口的类的实例,但创建新实例只会返回NULL。当调用操作的页面加载时,我收到这个错误:

致命错误:在第31行的/home/data/www/z1785732/public_html/467/PlaceOrderController.php中对null的成员函数getParameters()进行调用

以下是我正在处理的文件:

这是控制器。返回NULL的特定类是ParameterInterface。

<?php
include 'ItemDB.php';
include 'OrderDB.php';
include 'ccInterface.php';
include 'ParameterInterface.php';
class PlaceOrderController {
    var $itemDB;
    var $parameter;
    var $orderDB;
    var $ccInterface;
    function __construct() {
            $this->itemDB = new ItemDatabase();
            $this->ccInterface = new ccInterface();
            $this->parameter = new ParameterInterface();
    }
    public function displayCatalog() {
            return $this->itemDB->displayCatalog();
    }
    public function searchItem($itemNum) {
            return $this->itemDB->searchItem($itemNum);
    }
    public function getParameters() {
            return $this->parameter->getParameters();
    }
    public function addOrder() {
            $this->orderDB->addOrder($array1, $array2);
    }
    public function ccAuthorize($ccInfo) {
            return $this->ccInterface->ccAuthorize($ccInfo);
    }
}
?>

这里是ParameterInterface.php,函数就是在这里定义的。

<?php
class ParameterInterface {
    function connect() {
    $servername = '';
    $dbname='';
    $username = '';
    $password = '';
    try {
            $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
            $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    }
    catch(PDOException $e){
            echo "Connection failed: ". $e->getMessage();
    }
    return $conn;
    }
    public function getParameters() {
            $conn = $this->connect();
            $query = "SELECT * FROM Admin;";
            $result = $conn->query($query);
            $row = $result->fetch(PDO::FETCH_ASSOC);
            return $row;
    }
}
?>

我希望这只是一些简单的事情,我的眼睛没有捕捉到。如有任何帮助,我们将不胜感激。

提前感谢!

实现Serializable接口,以便能够在会话中序列化控制器:

class PlaceOrderController implements Serializable
{
    // ... 
    public function serialize()
    {
        return serialize(array(
            $this->itemDB,
            $this->parameter,
            $this->orderDB,
            $this->ccInterface
        ));
    }
    public function unserialize($serialized)
    {
        list(
            $this->itemDB,
            $this->parameter,
            $this->orderDB,
            $this->ccInterface
        ) = unserialize($serialized);
    }
    // ... 
}

记住,完成此操作后要开始一个新会话。(清除您的cookie)您可能在当前会话中使用旧的PlaceOrderController对象,但不适当。

此外,您可能需要重新思考整个脚本。这不是Java。为什么要在会话中存储PlaceOrderController

您的代码对我来说已经足够干净了……然而;根据您使用的PHP版本,var关键字在这里可能不理想,因为它的意思是Public。如果您的成员变量为公共变量;getter和setter实际上或多或少没有那么必要。

回到问题上来我建议查看一下文件的名称:ParameterInterface.php,因为它可能没有被正确包含,可能是文件名中的一个类型。注意各种情况(上限和下限-取决于您的操作系统)。试着先检查文件是否存在,看看你得到了什么;像这样:

    <?php
        if(file_exist("ParameterInterface.php")){
            include "ParameterInterface.php";
            die ("Sure, ParameterInterface.php exists and it has been included...");                
        }else{
            die("Ah haaaa! Gotcha!!! So, 'ParameterInterface.php' does not exist in the current Directory....");
        }
        //AFTER THIS QUIRK DEBUGGING... YOU MIGHT JUST KNOW MORE...

你介意尝试重新定义你的类吗?类似:

    <?php
        class ParameterInterface {
            /**
             * @var PDO $CON_LINK
             */
            protected static $CON_LINK;
            //WOULDN'T HURT TO ADD AN EMPTY CONSTRUCTOR... NOW, WOULD IT?
            function __construct(){
                $servername         = '';
                $dbname             = '';
                $username           = '';
                $password           = '';
                if(!self::$CON_LINK) {
                    try {
                        self::$CON_LINK = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
                        self::$CON_LINK->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
                    } catch (PDOException $e) {
                        echo "Connection failed: " . $e->getMessage();
                    }
                }
            }
            function connect() {
                return self::$CON_LINK;
            }
            public function getParameters() {
                $conn = $this->connect();
                $query = "SELECT * FROM Admin;";
                $result = $conn->query($query);
                $row = $result->fetch(PDO::FETCH_ASSOC);
                return $row;
            }
        }
    ?>

希望这能有所帮助。。。