我玩过CodeIgniter,为了扩展我的PHP知识,我试图创建自己的框架。
我遇到的问题是我想要一个等效的CodeIgniter get_instance()函数。但通过我的所有搜索,我无法理解它,也不知道我是否在正确的背景下使用它。
我相信我正在寻找的是单身人士模式,但我无法弄清楚如何实施它,所以任何人都可以帮助我吗?
我希望能够从内容函数中访问框架的$ page变量。
[我希望感谢这是一个简化版本,我的编码通常比这更好..]
编辑前:
<?php
class Framework {
// Variables
public $page;
function __construct()
{
// For simplicity's sake..
$this->page->title = 'Page title';
$this->page->content->h1 = 'This is a heading';
$this->page->content->body = '<p>Lorem ipsum dolor sit amet..</p>';
$this->output();
}
function output()
{
function content($id)
{
// I want to get an instance of $this
// To read and edit variables
echo $this->page->content->$id;
}
?>
<html>
<head>
<title><?php echo $this->page->title ?></title>
</head>
<body>
<h1><?php content('h1') ?></h1>
<?php content('body') ?>
</body>
</html>
<?php
}
}
new Framework;
编辑后:
<?php
class Framework {
// Variables
public $page;
public static function get_instance()
{
static $instance;
$class = __CLASS__;
if( ! $instance instanceof $class) {
$instance = new $class;
}
return $instance;
}
function __construct()
{
// For simplicity's sake..
$this->page->title = 'Page title';
$this->page->content->h1 = 'This is a heading';
$this->page->content->body = '<p>Lorem ipsum dolor sit amet..</p>';
$this->output();
}
function output()
{
function content($id)
{
$FW = Framework::get_instance();
// I want to get an instance of $this
// To read and edit variables
echo $FW->page->content->$id;
}
?>
<html>
<head>
<title><?php echo $this->page->title ?></title>
</head>
<body>
<h1><?php content('h1') ?></h1>
<?php content('body') ?>
</body>
</html>
<?php
}
}
new Framework;
答案 0 :(得分:4)
get instance 方法通常就像这样....
public static function getInstance() {
static $instance;
$class = __CLASS__;
if ( ! $instance instanceof $class) {
$instance = new $class;
}
return $instance;
}
static
关键字保存状态。$instance
是否是此类中的实例化对象。所以调用Class::getInstance()
会在第一次调用时返回一个新对象,subsequent calls will return the existing object。
单身人士常常因为一些原因而感到不满,Wikipedia covers them rather well ......
这种模式使得单元测试远远不够 更难,因为它介绍 全球国家进入申请。
有 还应该注意这种模式 降低了并行性的可能性 在一个程序内,因为访问 多线程中的单例 上下文必须序列化,例如,通过 锁定。
依赖的倡导者 注射会认为这是一个 反模式,主要是由于其使用 私有和静态方法。
有些人有 建议的方法来打破 单身模式使用方法等 作为语言中的反映 Java或PHP。
答案 1 :(得分:0)
使用PHP在单例模式上找到了一篇非常好的文章。这家伙在解释它时做得很好:http://phpadvocate.com/blog/?p=211