gpt4 book ai didi

php - 在命名空间中扩展 PHP 类

转载 作者:行者123 更新时间:2023-12-04 16:56:30 26 4
gpt4 key购买 nike

我有一个 PHP 类——一个通用的 ODBC 数据库接口(interface)。虽然方法永远不会改变(因为它使用 PDO),但连接字符串会。为避免用户手动传入整个连接字符串或指定要放入连接字符串的 ODBC 驱动程序,我扩展了该类并创建了 SQL Server 特定版本。

通用 PDO ODBC 驱动程序

class PDO_ODBC implements DBDriver{
private $driver;
private $connection_string;

public function connect(){
if(!$this->driver || !$this->connection_string){
throw new \Exception("Invalid connection string or database driver.");
}
}
}

SQL Server 特定版本
class PDO_ODBC_SQL_Server extends PDO_ODBC{
public function __construct(){
$this->driver = 'SQL Server';
$this->connection_string = 'odbc:Driver={[Driver]};Server=[Host];Database=[DBName];Uid=[Username];Pwd=[Password]';
}
}

问题是,当我创建一个新的 PDO_ODBC_SQL_Server 时对象并调用 connect() ,抛出异常是因为 $this->driver$this->connection_string不存在。但这怎么可能?如果我使用 print_r ,我看到了这两个属性。需要注意的一件事是 print_r还显示了除驱动程序和连接字符串之外的所有属性的类的命名空间,如下所示: http://pastebin.com/qh40eDpa .实际上,命名空间下有连接字符串和驱动程序的独立变量。

如何解决这个问题并防止抛出异常,同时仍然能够通过扩展基本 ODBC 类来使用类似的设计模式?如果没有,那么另一种选择是允许开发人员传入驱动程序和连接字符串...

请注意,为简洁起见,我在上面的代码示例中省略了大部分私有(private)变量。这两个类都位于单独的文件中,并在命名空间 Lib\Database 下。

最佳答案

使类属性protected或者如果你想保持它们的私密性,可以制作 getter 和 setter。私有(private)属性只能从声明它们的类访问,不能从派生类访问。

class PDO_ODBC implements DBDriver{
protected $driver;
protected $connection_string;

public function connect(){
if(!$this->driver || !$this->connection_string){
throw new \Exception("Invalid connection string or database driver.");
}
}
}

http://php.net/manual/en/language.oop5.visibility.php#language.oop5.visibility-members

关于php - 在命名空间中扩展 PHP 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13713706/

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