我正在尝试学习如何正确编写 PHP OOP 代码。 这就是我遇到问题的地方。
我创建了几个扩展主Application
类的类,我想让事情正常工作。
我的主文件是index.php,如下所示:
include_once('classes/Application.php');
include_once('classes/Configuration.php');
include_once('classes/Database.php');
$app = new Application;
$config = new Configuration;
$db = new Database;
var_dump($app->db_connected);
var_dump($db->db_connected);
$db->connect($config->dbhost, $config->dbuser, $config->dbpass, $config->dbname);
var_dump($app->db_connected);
var_dump($db->db_connected);
输出为:
1. bool(false)
2. bool(false)
3. bool(false)
4. bool(true)
我的主应用程序文件如下所示:
class Application {
public $db_connected = false;
}
我的数据库类如下所示:
class Database extends Application {
function connect($dbhost, $dbuser, $dbpass, $dbname) {
if(!$this->db_connected) {
mysql_connect($dbhost, $dbuser, $dbpass) or die(mysql_error());
mysql_select_db($dbname) or die(mysql_error());
$this->db_connected = true;
}
}
}
所以问题是,为什么 index.php 输出的第 3 行会显示 false? Database 类中的 db_connected 属性已被覆盖并设置为 TRUE,但它仍然返回 false。
尽管直接从数据库类实例访问时,它正确显示 TRUE。这是怎么回事?
类 EXTEND 命令何时发生?每当创建父类的实例时,或者我必须手动创建子类的实例?
最佳答案
看来您正在达到static
变量的概念,类的所有实例共享相同的静态变量,因此使用 new 两次不会出现问题。
您可以在 ideaone 上看到代码.
// your code goes here
class Application {
static $db_connected = false;
}
class Database extends Application {
function connect() {
if(!static::$db_connected) {
static::$db_connected = true;
}
}
}
$app = new Application;
$db = new Database;
var_dump(Application::$db_connected);
var_dump(Database::$db_connected);
$db->connect();
var_dump(Application::$db_connected);
var_dump(Database::$db_connected);
你的评论让我觉得你正在寻找更好的模式。我想抛出一些关键原则,即 OCP 和 LSP SOLID .
在这种情况下,您将避免让 Application
成为 Database
的实例,而是使用依赖项注入(inject)。这是重构的代码。
class Database {
private $db_connect = false;
public function connect () {
if(!$this->db_connect) { /* do connection */ }
}
}
class Application {
private $db;
public function setDatabse(Database $db) {
$this->db = $db;
}
public function getDatabase() {
return $this->db;
}
}
$db = new Database;
$app = new Application;
$app->setDatabase($db);
$app->getDatabase()->connect();
关于PHP OOP 最佳实践或如何正确编码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26706668/