PHP类方法和构造函数

时间:2020-05-14 14:10:52

标签: php class object methods static

当前,我有一个简单的数据库类,它将加载文件.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);
}

1 个答案:

答案 0 :(得分:0)

由于您正在扩展声明了变量static的类,因此可以在子类中使用staticself关键字来访问它们;请查看this answer,以更详细地了解两个保留关键字之间的区别。

相反,如果要引用实例变量,则应使用$this

请记住,您可以在子类(在您的情况下,我指的是User)中访问父类(即{{1中的)publicprotected中定义的所有内容}}。看看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,因此在两个类中的任何一个中进行更改都会反映这两个类中的更改。

相关问题