我有一个PHP类 - 一个通用的ODBC数据库接口。虽然这些方法永远不会改变(因为它使用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
还显示了除驱动程序和连接字符串之外的所有属性的类的命名空间,如下所示:{{3} }。实际上,在命名空间下有连接字符串和驱动程序的单独的变量。
如何修复此问题并防止抛出异常,同时仍然可以通过扩展基本ODBC类来使用类似的设计模式?如果没有,那么替代方法是允许开发人员传入驱动程序和连接字符串......
注意,为简洁起见,我省略了上面代码示例中的大多数私有变量。这两个类都位于单独的文件中,位于命名空间Lib\Database
答案 0 :(得分:1)
如果要将它们保密,请创建类属性protected
或制作getter和setter。私有属性只能从声明它们的类中访问,而不能从派生类中访问。
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