php init()和__construct() 区别

时间:2022-06-26
本文章向大家介绍php init()和__construct() 区别 ,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

区别

__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类从而失去单例模式意义
  • 必须提供一个访问这个实例的公共静态方法,从而返回唯一实例的一个引用