我有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;
}
}
使用此文件我可以使用类和类的函数
text.php:
$db=new AFactory();
$link=$db->getDBO();
$db->loadAssoc($db->setQuery("SELECT * FROM users")); // this can return array
我想创建新类并使用Afactory类
testclass.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类后,我无法使用此方法:
useTestClass:
include('testclass.php');
print_r( alachiq::fetchArray() );
我的代码问题是什么?
答案 0 :(得分:7)
首先简要介绍一下mysql:
Please, don't use mysql_*
functions in new code。它们不再被维护and are officially deprecated。请参阅red box?转而了解prepared statements,并使用PDO或MySQLi - this article将帮助您确定哪个。如果您选择PDO here is a good tutorial。
启用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() );
答案 1 :(得分:1)
您遇到的主要问题是如何使用静态和对象方法的混淆。
你这样称呼它:
print_r(alachiq::fetchArray());
这意味着您要将其称为静态方法。 fetchArray
方法未声明为static
,但如果您调用的方法充当静态方法,则可以使用该方法。
问题出现在fetchArray
调用parent::getDBO
时。 getDBO
引用了$this
,这意味着该方法不 static
。
这就是调用alachiq::fetchArray()
失败的原因;你试图用非静态方法进行静态调用。
解决方案:
您需要创建对象的实例并调用:
$myobj = new alachiq();
print_r($myobj->fetchArray());
这应该有所帮助。