gpt4 book ai didi

PHP OOP 最佳实践或如何正确编码?

转载 作者:行者123 更新时间:2023-12-02 11:21:34 25 4
gpt4 key购买 nike

我正在尝试学习如何正确编写 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com