PHP创建类的新实例返回NULL

时间:2016-05-04 00:13:14

标签: php

我目前正在创建一个非常简单的在线订购网站,作为学校项目的一部分。我遇到了一个问题,我的控制器试图创建一个与我的订单参数接口的类的实例,但是创建新实例只会返回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;
    }
}
?>

我希望它只是一些简单的东西,我的眼睛不会被抓住。任何帮助将不胜感激。

提前致谢!

2 个答案:

答案 0 :(得分:1)

实现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

答案 1 :(得分:-1)

你的代码对我来说似乎很干净......但是;根据您使用的PHP版本, var 关键字可能不太理想,因为它意味着公开。如果您的会员变量是公开的;吸气剂和孵化器实际上或多或少都不是必需的。

回到问题。 我建议您查看文件的名称: 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;
            }
        }
    ?>

希望这有点帮助...