当前位置: 首页 > 知识库问答 >
问题:

PHP5,带有static/private、$this和self:的类和变量/方法作用域:

丌官星渊
2023-03-14

我有这个:

class Database{    
    private $name = '';
    private $user = '';
    private $password = '';   
    private $host = 'localhost';
    private $prefix = '';   
    private $connection_handle = null;

    private function Connect(){
        $this->connection_handle = mysql_connect($this->host, $this->user, $this->password); 

        if( !$this->connection_handle ){
            die( 'Could not connect: ' . mysql_error() );
        }else{
            mysql_select_db( $this->name, $this->connection_handle );
        }
    }

    private function Close(){
        mysql_close( $this->connection_handle );
    } 

    public static function Query( $query ){
        $this->Connect();   
            $result = mysql_query( $query, $this->connection_handle );
            if( !$result ){
                die( 'Error: ' . mysql_error() );
            }else{
                $DatabaseQuery = new DatabaseQuery();
                    $DatabaseQuery->result = $result;       
                    $DatabaseQuery->mysql_num_rows = mysql_num_rows($result);

                return $DatabaseQuery;
            }
        $this->Close();
    } 
}

我已经使查询静态,因为它将被称为像"数据库e::查询"其他函数不需要被任何其他类访问,所以我使它们私有...

从查询函数访问连接函数时,会出现此错误。

"不在对象上下文中使用$this"

考虑到private使这些变量对这个类是私有的,但对其中的所有方法都是可用的,所以我在获取函数的范围方面遇到了问题。。。

我可以做self::Connect(),但我对它的理解还不足以保证它的使用。。。

你能解释一下self::和%this之间的区别吗-

我也不能访问我的私有变量,它们真的不需要在这个类之外访问,我再次将它们设置为私有,因为。。。然而,这一美元-

我真的需要把它们都公开吗?必须有一种方法使它们只对这个类和它的扩展可用?

----------------------编辑:///

我已经结束了我所有的变量私有静态。这是一种可以接受的方式吗?

----------------------编辑:///

我现在得到了以下代码:

class Database{    
    private static $name = '';
    private static $user = '';
    private static $password = '';   
    private static $host = 'localhost';
    private static $prefix = '';   
    private static $connection_handle = null;

    private static function Connect(){
        self::$connection_handle = mysql_connect(self::$host, self::$user, self::$password); 

        if( !self::$connection_handle ){
            die( 'Could not connect: ' . mysql_error() );
        }else{
            mysql_select_db( self::$name, self::$connection_handle );
        }
    }

    private static function Close(){
        mysql_close( self::$connection_handle );
    } 

    public static function Query( $query ){
        self::Connect();   
            $result = mysql_query( $query, self::$connection_handle );
            if( !$result ){
                die( 'Error: ' . mysql_error() );
            }else{
                $DatabaseQuery = new DatabaseQuery();
                    $DatabaseQuery->$result = $result;       
                    $DatabaseQuery->$mysql_num_rows = mysql_num_rows($result);

                return &$DatabaseQuery;
            }
        self::Close();
    } 
}

但是返回指针引用不起作用?事实上,我并不是最新的PHP指针,有人能解释一下我做错了什么吗?

这是因为我正在函数中声明DatabaseQuery类的新实例,不是吗。HELPPP:)

编辑::///////

我已经完成了我的课程,它看起来像这样:

class DatabaseQuery{
    public $result;
    public $mysql_num_rows;        
}

class Database{    
    private static $name = '';
    private static $user = '';
    private static $password = '';   
    private static $host = 'localhost';
    private static $prefix = '';   
    private static $connection_handle = null;

    protected function Connect(){
        self::$connection_handle = mysql_connect(self::$host, self::$user, self::$password); 

        if( !self::$connection_handle ){
            die( 'Could not connect: ' . mysql_error() );
        }else{
            mysql_select_db( self::$name, self::$connection_handle );
        }
    }

    protected function Close(){
        mysql_close( self::$connection_handle );
    } 

    public static function FetchQueries( &$queries ){
        $db_query = array();
            self::Connect();   
                foreach( $queries as $key => $query ){
                    $result = mysql_query( $query, self::$connection_handle );
                    if( !$result ){
                        die( 'Error: ' . mysql_error() );
                    }else{
                        $DatabaseQuery = new DatabaseQuery();
                            $DatabaseQuery->result = $result;       
                            $DatabaseQuery->mysql_num_rows = mysql_num_rows($result);  
                            $db_query[ $key ] = $DatabaseQuery; 
                    }
                }
            self::Close();
        return $db_query;
    } 
}

现在您可以用模型视图控件(MVC)的方式调用它,因为您正在顶部(或在单独的文件中)定义所有数据

$queries = array(
    "bottoms" => "SELECT * FROM bottoms", 
    "users" => "SELECT * FROM users"           
);            
$dbr = Database::FetchQueries( $queries );


//display some users
while( $row = mysql_fetch_object( $dbr["apps"]->result ) ){
    echo $row->title; 
}    

//display some bottoms
while( $row = mysql_fetch_object( $dbr["bottoms"]->result ) ){
    echo $row->title; 
}

你能告诉我你对MVC方法的看法吗?

共有1个答案

微生嘉祥
2023-03-14

您应该使您的数据库类实例化。现在,您正在为每个查询打开一个新的连接,这有一个糟糕的性能(非常糟糕)。您可以将这个类设置为单例(实际上通常是这样做的,因为通常只有一个与数据库的连接是有意义的)。

所以你的代码(非常简化)应该是这样的:

class Database
{
  private static $instance;

  protected function __construct() {
    self::$instance = mysql_connect(...);
    // do some error checking!
  }

  protected function __clone() {}

  public static function getInstance() {
    if (!isset(self::$instance)) {
      self::$instance = new Database();
    }
    return self::$instance;
  }

  public function query($sql) {
    do mysql_query(...) and error checking, return $result or your own DatabaseQuery()
  }
}

通过这种方式,您不能直接进行调用静态函数的查询,但可以在此类中添加另一个函数:

public static function makeQuery($sql) {
  $db = self::getInstance();
  return $db->query($sql);
}

要将此类用于实例,应调用$db=Database::getInstance() ,而$db是一个数据库对象,您可以正常调用它的公共方法。如果您只想继续进行静态调用以进行查询,只需调用$result=Database::makeQuery($sql)。无论哪种方式,都可以保证您只有一个到数据库的连接(这是singleton所做的),这样您就不会有当前为每个查询启动新连接的开销。

还可以考虑使用<代码> mySqLI< /COD>或<代码> PDO MySQL < /Cord>,而不是旧的和不推荐的代码> mySqL**函数(参见代码顶部的警告> mySqLyCu连n)。有关每个API的更多信息和优点,请参见选择MySQL API

 类似资料:
  • 本文向大家介绍Ruby类实例变量、类实例方法和类变量、类方法的区别,包括了Ruby类实例变量、类实例方法和类变量、类方法的区别的使用技巧和注意事项,需要的朋友参考一下 在Ruby中类实例变量、类实例方法和类变量、类方法的区别比较微妙,而且用法也有相当的区别。本文探讨一下他们的定义和基本的使用场景,以抛砖引玉...   一.类实例变量和类变量   类变量大家都很熟悉了,就是在类定义中用@@开头的变量

  • 本文向大家介绍C#类中static变量用法分析,包括了C#类中static变量用法分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#类中static变量用法。分享给大家供大家参考。具体分析如下: 先来看一段代码: 上面的代码是一个网友告诉我的,让我看看结果,我看了一眼马上说结果是 i=1 j=1 网友运行后说结果是 i=0 j=1 我吓了一跳,认真看了代码,原来自己真的错了。 下面我

  • 问题内容: 在下面的示例中,使用和之间有什么区别? 产生 问题答案: 当您用来指代一个类成员时,您指的是您在其中使用关键字的类。在这种情况下,您的类定义了一个称为的受保护静态属性。当您在类中使用来引用属性时,您将引用同一类。 因此,如果您尝试在类中的其他地方使用,但您拥有一个属性值不同的类,则它将使用代替,这可能不是您想要的: 当通过 调用 方法时,您正在调用一个称为后期静态绑定的功能(在PHP

  • Vdt模板编译的结果,会添加如下代码 function(obj) { var self = this.data, scope = obj; .... } vdt.render() 方法这样调用模板函数 var vdt = { render: function() { template.call(vdt, data); ... } } 所以 this 模板中t

  • 本文向大家介绍php中static 静态变量和普通变量的区别,包括了php中static 静态变量和普通变量的区别的使用技巧和注意事项,需要的朋友参考一下 php中static 静态变量和普通变量的区别 在变量的前面加上static 就构成了静态变量(static 变量)。 static变量和普通变量的区别在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各

  • 本文向大家介绍PHP中new static() 和 new self() 的区别介绍,包括了PHP中new static() 和 new self() 的区别介绍的使用技巧和注意事项,需要的朋友参考一下 长夜漫漫啊! 今天领导本地搭建一个站。发现用PHP 5.2 搭建不起来,站PHP代码里面有很多5.3以上的部分,领导让苦逼我更改在5.2下能运行。 改着改着发现了一个地方 这尼玛是神马,只见过 于