文档章节

php init()和__construct() 区别

solate
 solate
发布于 2016/08/16 16:20
字数 560
阅读 556
收藏 1

区别

__construct()

__construct(): 是PHP内置的构造函数,实例化之前 PHP 解析引擎自动调用,做一些初始化的工作或者外部服务器检测的工作。在实例化对象之前需要做的工作都写在这里

init() :

init()方法一般都是自己定义的,可以随便写名字,一般会在__construct() 中写 调用。功能和__construct()差不多但是需要自己写调用, 其实就是普通方法,只是这个方法大家一般默认都是用来初始化东西的。

protected function __construct

如果将 __construct 定义为 protected 那么就不能直接实例化了,需要添加一个额外的入口,这个入口一般是静态方法public static function instance

<?php


class Test {



	public function init(array $config) {
		echo "3: init..... \n";
		var_dump($config,);
	}

	protected function __construct(array $config = array()) {
		echo "2: __construct ..... \n";
		phpversion() > "5.3" || exit("版本过低,请升级版本");
		$this->init($config);
	}

	public function instance($config = array()) {
		echo "1: instance ..... \n";
		return new self($config);
	}


}

$config = array("test"=>1);

$test = Test::instance($config);

var_dump($test);

如果不需要参数只需要将所有的参数$config去掉都好了

结果

1: instance .....
2: __construct .....
3: init.....
array(1) {
  'test' =>
  int(1)
}
class Test#1 (0) {
}

单例模式

class Singleton  
{  
    /** 
     * Description:(1)静态变量,保存全局实例,跟类绑定,跟对象无关 
     *             (2)私有属性,为了避免类外直接调用 类名::$instance,防止为空 
     */  
    private static $instance;  
      
    /** 
     * Description:数据库连接句柄 
     */  
    private $db;  
      
    /** 
     * Description:私有化构造函数,防止外界实例化对象 
     */  
    private static function __construct()  
    {  
    }  
      
    /** 
     * Description:私有化克隆函数,防止外界克隆对象 
     */  
    private function __clone()  
    {  
    }  
      
    /** 
     * Description:静态方法,单例访问统一入口 
     * @return Singleton:返回应用中的唯一对象实例 
     */  
    public static function GetInstance()  
    {  
        if (!(self::$instance instanceof self))  
        {  
            self::$instance = new self();  
        }  
        return self::$instance;  
    }  
      
    /** 
     * Description:获取数据库的私有方法的连接句柄 
     */  
    public function GetDbConnect()  
    {  
        return $this->db;  
    }  
}  
  • 需要一个保存类的唯一实例的静态成员变量(通常$instance为私有变量)
  • 构造函数和克隆函数必须声明为私有的,为了防止外部程序new类从而失去单例模式意义
  • 必须提供一个访问这个实例的公共静态方法,从而返回唯一实例的一个引用

© 著作权归作者所有

共有 人打赏支持
solate
粉丝 7
博文 111
码字总数 87151
作品 0
成都
程序员
加载中

评论(2)

solate
solate

引用来自“AngusXer”的评论

不就是单例么。。。

额 单例还是有点区别,你搜一下单例,private 变量和private 构造方法并且重写__clone防止克隆
全体人员
全体人员
不就是单例么。。。
PHP $this->方法调用

Reference: http://docs.php.net/manual/en/language.oop5.late-static-bindings.php Note: In non-static contexts, the called class will be the class of the object instance. Since wi......

ch-gilbert
2015/06/16
0
0
thinkphp _initialize 和 __construct函数的关系

thinkphp 框架的 initialize() 函数 和 php 原生的 construct() 构造函数并没有什么本质上的区别,你完全可以把 initialize() 作为 construct() 的别名函数来用,但当你有编写 construct() ...

big_cat
2016/01/26
150
0
关于PHP OOP的一个问题,对象引用

db = new db(); $this->db->host = 'localhost'; } function inituser() { $this->user = new user($this); } } class db { var $host; } class user { var $controller; var $db; function ......

合肥华仔
2012/08/26
219
2
PHP中serialize和json序列化与反序列化的区别

(本文转载自 https://blog.tanteng.me/2015/11/serialize-json-diff/) 在PHP中,serialize和json两种方式对一个对象或数组进行序列化或反序列化有什么区别呢? 假设一个对象和一个数组: ...

shangluyi
06/26
0
0
初学objective-c之读书笔记(一)

基本语法: static定义在全局变量上时会改变其作用域,对应所在的局部范围。extern类似php中的global。 结构体struct定义了一个多维kv数组,枚举类型enum检测数据范围,两者通过typedef可封装...

_EKC
2012/11/01
0
2

没有更多内容

加载失败,请刷新页面

加载更多

下单接口调优实战,性能提高10倍

概述 最近公司的下单接口有些慢,老板担心无法支撑双11,想让我优化一把,但是前提是不允许大改,因为下单接口太复杂了,如果改动太大,怕有风险。另外开发成本和测试成本也非常大。对于这种...

Sam哥哥聊技术
24分钟前
2
1
rabbitMQ的安装和配置

在Windows下进行rabbitMQ的安装 第一步:软件下载 在安装rabbitMQ之前,需要先安装Erlang。 Erlang官网:http://www.erlang.org/downloads rabbitMQ官网:http://www.rabbitmq.com/download....

狼王黄师傅
44分钟前
2
0
SAP产品的Field Extensibility

SAP开发人员的工作职责,除了实现软件的功能性需求外,还会花费相当的精力实现一些非功能性需求,来满足所谓的SAP Product Standard(产品标准)。这些产品标准,包含在SAP项目实施中大显身手...

JerryWang_SAP
49分钟前
2
0
Vue-Element-Upload

记录一下文件上传封装Js 代码示例 封装:uploadFile.vue <template> <el-upload v-model="attachment" ref="upload" class="upload-demo" :action="uploadUrl" ......

华山猛男
56分钟前
3
0
AWVS破解及使用手册

1.安装 因为是windows软件,比较简单,此部分略: 破解插件下载: 链接: https://pan.baidu.com/s/1x9LK9F3KvqDgTvXDjoSZnQ 提取码: 7k4u 2.创建扫描目标 2-1.Targets->Add Target 2-2.对话框...

硅谷课堂
59分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部