【问题标题】:Extending PHP Class in Namespace在命名空间中扩展 PHP 类
【发布时间】:2012-12-04 23:16:28
【问题描述】:

我有一个 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也显示了所有属性的类的命名空间除了驱动程序和连接字符串,如下所示:http://pastebin.com/qh40eDpa。其实命名空间下还有连接字符串和驱动的单独的变量。

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

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

【问题讨论】:

    标签: php class namespaces


    【解决方案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

    【讨论】:

      猜你喜欢
      • 2017-08-26
      • 2012-01-08
      • 2014-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-16
      • 2011-06-28
      • 2017-11-24
      相关资源
      最近更新 更多