在PHP5中,使用const和有static什么区别?什么时候适合?和什么样的作用呢public,protected和private游戏-如果有的话.
我通过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) 可能重复:
谁需要单身人士?
我总是写最佳实践,但我也想了解为什么给定的东西是最佳实践.
我读过一篇文章(遗憾的是我不记得),单例类更喜欢被实例化,而不是用静态函数创建并使用范围解析运算符(::)进行访问.因此,如果我有一个包含所有要验证的工具的类,简而言之:
class validate {
private function __construct(){}
public static function email($input){
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
我被告知这被认为是不好的做法(或者至少被警告过),因为有垃圾收集器和维护这样的东西.所以对"单体类作为静态方法"的批评是什么,我实例化一个类我100%肯定我只会实例化一次.对我来说,它似乎在做"双重工作",因为它已经准备好了.我错过了什么?
对此事有何看法?当然,这不是生死攸关的问题,但如果有选择的话,人们也可以做正确的事情:)
我正在创建一个php restful API,目前我在每个函数中都有数据库连接信息.
//Connect To Database
$hostname=host;
$username=username;
$password=password;
$dbname=dbname;
mysql_connect($hostname, $username, $password) OR DIE('Unable to connect to database! Please try again later.');
mysql_select_db($dbname);
mysql_query($sqlApiAccess) or die('Error, insert query failed');
Run Code Online (Sandbox Code Playgroud)
这样做的最佳方法是什么,每个php文件可以有一个数据库连接吗?或者我是否需要按使用数据库的功能执行此操作.
由于您无法在静态函数中使用$ this->,您应该如何访问静态函数中的常规函数?
private function hey()
{
return 'hello';
}
public final static function get()
{
return $this->hey();
}
Run Code Online (Sandbox Code Playgroud)
这会引发错误,因为你不能在静态内使用$ this->.
private function hey()
{
return 'hello';
}
public final static function get()
{
return self::hey();
}
Run Code Online (Sandbox Code Playgroud)
这会引发以下错误:
Non-static method Vote::get() should not be called statically
Run Code Online (Sandbox Code Playgroud)
如何在静态方法中访问常规方法?在同一个班*
我如何使用最初在整个站点中加载的对象实例?
我希望$ myinstance可以在任何地方使用.
$myinstance = new TestClass();
Run Code Online (Sandbox Code Playgroud)
谢谢!
我正在尝试学习PHP OOP,并对如何在我的项目中使用全局数据库类进行了一些研究.从我所看到的,最合适的模式是一个单例,它可以确保始终只存在一个数据库连接.然而,由于这是我第一次使用Singleton模式,我不确定我是否做得对.
这是一个合适的单身人士吗?此代码是否仅确保一个数据库连接?有什么办法可以测试吗?(学会钓鱼的人,他将在余生中获得食物......)
我使用redbean作为我的ORM,这是我如何明确地设置它:
require_once PLUGINPATH.'rb.php';
$redbean= R::setup("mysql:host=192.168.1.1;dbname=myDatabase",'username','password');
Run Code Online (Sandbox Code Playgroud)
我已经基于这个源创建了以下脚本,作为我自己的单例数据库类;
class database {
private $connection = null;
private function __construct(){
require_once PLUGINPATH.'rb.php';
$this->connection = R::setup("mysql:host=192.168.1.1;dbname=myDatabase",'username','password');
}
public static function get() {
static $db = null;
if ( $db === null )
$db = new database();
return $db;
}
public function connection() {
return $this->connection;
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢!
我想知道如何获得以下数据库连接的一个实例。
例如,假设这是我在文件 Database.php 中的类
public class Database {
public function __construct() {
try {
// PDO Here
print("Connected!");
} catch (PDOException $e) {
die($e->getMessage());
}
}
}
Run Code Online (Sandbox Code Playgroud)
索引.php
Database();
Database();
Run Code Online (Sandbox Code Playgroud)
结果
Connected!Connected!
即使我调用它两次,我也只想实例化该类一次。