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