当前,我有一个简单的数据库类,它将加载文件.env并将其加载到类中的私有变量中。 该数据库类将从另一个包含静态方法的类中调用。在数据库类中调用变量的最佳方法是什么?
数据库
namespace System;
class Database
{
public static $host;
public static $user;
public static $pass;
public static $name;
public static $secretKey;
public function __construct()
{
$tmp = parse_ini_file($_SERVER['DOCUMENT_ROOT']."/.env");
self::$host = $tmp['mariadb_host'];
self::$user = $tmp['mariadb_user'];
self::$pass = $tmp['mariadb_pass'];
self::$name = $tmp['mariadb_name'];
self::$secretKey = $tmp['secret_key'];
}
}
Class User extends Database
{
$self = new static;
$mysqli = mysqli_connect($self::$host, $self::$user, $self::$pass, $self::$name);
}
答案 0 :(得分:0)
由于您正在扩展声明了变量static
的类,因此可以在子类中使用static
或self
关键字来访问它们;请查看this answer,以更详细地了解两个保留关键字之间的区别。
相反,如果要引用实例变量,则应使用$this
。
请记住,您可以在子类(在您的情况下,我指的是User
)中访问父类(即{{1中的)public
或protected
中定义的所有内容}}。看看visibility手册的页面。
在这里,我发布一个简单的示例来演示这三个关键字的不同用法:
Database
将输出:
class Database {
public static $foo = 'foo';
public $bar = 'bar';
public function __construct() {
echo self::class . " is being constructed\n\n";
}
public function log() {
echo "static::class = " . static::class . "\tself::class = " . self::class . "\n\n";
echo 'self::$foo = ' . self::$foo . "\n";
echo '$this->bar = ' . $this->bar . "\n";
echo "------------------------\n\n\n";
}
}
class User extends Database {
public function __construct() {
parent::__construct();
echo self::class . " is being constructed\n\n";
static::$foo = 'foo from class User';
}
}
$db = new Database();
$db->log();
$user = new User();
$user->log();
请注意,Database is being constructed
static::class = Database self::class = Database
self::$foo = foo
$this->bar = bar
------------------------
Database is being constructed
User is being constructed
static::class = User self::class = Database
self::$foo = foo from class User
$this->bar = bar
------------------------
是指使用该类的类,而self
是指实际被调用的类。
还请注意,由于已将两个变量声明为static
,因此在两个类中的任何一个中进行更改都会反映这两个类中的更改。