Php类方法和构造函数

问题描述 投票:0回答:1

当前,我有一个简单的数据库类,它将加载文件.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);
}
php class object methods static
1个回答
0
投票

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

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

[请记住,您可以在子类中访问(在您的情况下,我指的是User)在父类(即:public中)中定义的所有protectedDatabase。看看visibility手册页。

这里发布一个简单的示例来演示三个关键字的不同用法:

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指的是实际调用的类。

还请注意,由于两个变量都声明为static,因此在两个类中的任何一个中更改它们都会反映这两个类中的更改。

© www.soinside.com 2019 - 2024. All rights reserved.