PHP使用父类函数

时间:2013-06-11 11:03:44

标签: php mysql

我有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() );

我的代码问题是什么?

2 个答案:

答案 0 :(得分:7)

首先简要介绍一下mysql:

Please, don't use mysql_* functions in new code。它们不再被维护and are officially deprecated。请参阅red box?转而了解prepared statements,并使用PDOMySQLi - 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());

这应该有所帮助。