1

我有 Afactory mysql 简单类,我可以使用这种方法:

Afactory.class.php

require_once ( substr( dirname(__FILE__), 0, -5 ).'config.inc' );
class AFactory
{
    private $DBhost;
    private $DBuser;
    private $DBpass;
    private $DBname;
    private $DBport;
    private $queryResult;
    private $linkConnection;
    public function __construct() 
    {
        $this->DBhost=LOCALHOST;
        $this->DBuser=USERNAME;
        $this->DBpass=PASSWORD;
        $this->DBname=DATABASE;
    }
    public function getDBO()
    {
        $linkConnection = mysql_connect ($this->DBhost , $this->DBuser , $this->DBpass);
        mysql_query("set charset set utf8", $linkConnection);
        mysql_query("set names 'utf8'", $linkConnection);           
        return  mysql_select_db($this->DBname) ? TRUE : FALSE;
    }
    public function setQuery($query)
    {
        return mysql_query($query);
    }
    public function loadAssoc()
    {
        $array=NULL;
        while($result = mysql_fetch_assoc($this->queryResult ))
             $array[] = $result;
        return $array;      
    }
}

有了这个文件,我可以使用类和类的功能

文本.php:

$db=new AFactory();
$link=$db->getDBO();
$db->loadAssoc($db->setQuery("SELECT * FROM users")); // this can return array

我想创建新类并使用 Afactory 类

测试类.php:

include ( substr( dirname(__FILE__), 0, -5 ).'alachiq_settings.php' );
class alachiq extends AFactory{
    public function __construct() {
       parent::__construct();
    } 
    public function fetchArray(){
       echo parent::getDBO(); //this line can return successfull connect to db
       return parent::loadAssoc(parrent::setQuery("SELECT * FROM users")); //fetch sql command

    }
}

在使用 Afactory 扩展创建 alachiq 类后,我无法使用此方法:

使用测试类:

include('testclass.php');
print_r(  alachiq::fetchArray() );

我的代码问题是什么?

4

2 回答 2

7

首先是关于mysql的简短说明:

请不要mysql_*在新代码中使用函数。它们不再被维护并被正式弃用。看到红框了吗?改为了解准备好的语句,并使用PDOMySQLi -本文将帮助您决定使用哪个。如果您选择 PDO,这里有一个很好的教程


打开你的 error_reporting / display_errors...

这只是一个错字(parrent而不是parent):

return parent::loadAssoc(parrent::setQuery("SELECT * FROM settings")); //fetch sql command
// -------------------------^

正确

return parent::loadAssoc(parent::setQuery("SELECT * FROM settings")); //fetch sql command

此外,您不能在静态上下文中调用非静态函数:

print_r(  alachiq::fetchArray() );

这是一个静态调用;使用类实例:

$instance = new alachiq();
print_r(  $instance->fetchArray() );
于 2013-06-11T11:06:21.217 回答
1

您在这里遇到的主要问题是对如何使用静态方法和对象方法感到困惑。

你这样称呼它:

print_r(alachiq::fetchArray());

这意味着您想将其称为静态方法。该fetchArray方法未声明为static,但如果您调用的方法充当静态方法,则可以避免这种情况。

然而,当fetchArray调用parent::getDBO. getDBO引用$this,表示方法不是 static

这就是调用alachiq::fetchArray()失败的原因;您正在尝试对非静态方法进行静态调用。

解决方案:

您需要创建对象的一个​​实例并调用它:

$myobj = new alachiq();
print_r($myobj->fetchArray());

那应该有帮助。

于 2013-06-11T11:11:07.623 回答