我通过PDO访问我的MySQL数据库.我正在设置对数据库的访问权限,我的第一次尝试是使用以下内容:
我想到的第一件事是global:
$db = new PDO('mysql:host=127.0.0.1;dbname=toto', 'root', 'pwd');
function some_function() {
global $db;
$db->query('...');
}
Run Code Online (Sandbox Code Playgroud)
这被认为是一种不好的做法.一点点搜索后,我结束了与Singleton模式,其
"适用于需要单个类实例的情况."
根据手册中的示例,我们应该这样做:
class Database {
private static $instance, $db;
private function __construct(){}
static function singleton() {
if(!isset(self::$instance))
self::$instance = new __CLASS__;
return self:$instance;
}
function get() {
if(!isset(self::$db))
self::$db = new PDO('mysql:host=127.0.0.1;dbname=toto', 'user', 'pwd')
return self::$db;
}
}
function some_function() {
$db = Database::singleton();
$db->get()->query('...');
}
some_function();
Run Code Online (Sandbox Code Playgroud)
当我能做到这一点时,为什么我需要相对较大的课程呢?
class Database {
private static $db;
private function __construct(){}
static function get() …Run Code Online (Sandbox Code Playgroud) 为什么在像请求驱动的PHP这样的语言中难以测试单例或注册表模式?
除了实际的程序执行之外,您可以编写和运行测试,这样您就可以自由地影响程序的全局状态,并为每个测试函数运行一些拆卸和初始化,以使每个测试的状态达到相同状态.
我错过了什么吗?
我正在尝试将数组转换为对象.我想使用魔术方法 - 带有静态属性的__get和__set.
我的代码:
class UserData {
private static $id, $name, $login;
public function __get($var)
{
return self::$var;
}
public function __set($var, $val)
{
self::{$var} = $val;
}
}
Run Code Online (Sandbox Code Playgroud)
并设置:
foreach($userArray as $key => $val)
{
DaneBilingowe::${$key} = $val;
}
Run Code Online (Sandbox Code Playgroud)
错误:致命错误:无法访问私有属性UserData :: $ id
是否可以使用具有静态属性的魔术方法?
我有一个数据库类,用于进行选择,更新,删除MySQL查询.
现在,我想创建另一个类中的MySQL查询,但如果我定义$db = new DB();的index.php,我不能使用$db另一个类变种.$db如果我想进行查询,是否必须一遍又一遍地定义变量?或者有没有办法$db使用对象全局var 来创建var?
我正在设计一个Web应用程序(实际上,这是一个爱好,我正在尝试自学设计,还有什么比做它更好的方法:).无论如何,我在考虑如何处理我的数据库.我对PDO很满意,我想在我的抽象类中利用PDO.我正在考虑制作单例,因此只有一个数据库连接.这个单例将创建一个PDO连接.
在那之后,我不明白为什么我需要做太多其他事情.然后我可以使用数据库处理程序来调用PDO函数.我可能想要一些辅助函数,但是当它归结为它时,我只会将PDO用于实际的SQL查询.
这种方法有问题吗?与我使用的抽象类相比,它看起来过于简单.