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

标签 php oop parent extend

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

相关文章:

php - Laravel 请求转换

php - MySQL 查询在 Workbench 中工作正常,但在 PHP 中略有不同

php - 在特定列中具有最大值的MySQL查询记录

c# - 接口(interface)如何解决菱形继承(钻石问题)?

c++ - 来自多个类的虚拟事件处理程序 : multiple inheritance or composition?

oop - 如何发现 Perl 6 类型的所有角色?

java - opencsv不导出父类的属性

jquery 更改父级的 css

php - 制表数据库数据

Python super(Class, self).method vs super(Parent, self).method