PHP类的手动和自动加载

PHP中的类加载

  1. 手动加载类
<?php
	//定义类文件路径
	$class_path='c/include/Animal.php';
	if(!class_exists('Animal')){ //判断类是否存在
	    if(file_exists($class_path)){//判断类文件是否存在,如果存在就加载类文件
		    include_once $class_path;
		}
	}
	
	$a=new Animal();//实例化类
  1. __autoload()方法自动加载类.(注意:PHP 7.2.0 起废弃。强烈建议不要使用该方法)
/**
	** $className 类名(这个参数必须有)
	*/
	$a=new Animal();
	function __autoload($className){
	    $class_path='c/include/'.$className.'php';
		if(file_exists($class_path)){
		   include_once $class_path;
		}
	}
	$a=new Animal();//实例化类
  1. spl_autoload_register()方法自动加载类(强烈推荐)
//考虑一种情况:一个项目的类文件放在了不同的目录中,比如:require文件夹和include文件夹中。
	
	/**
	**加载require文件夹下的类
	*/
	function require_autoload($className){
	    $r_path=ROOT_PATH.'/require/'.$className.'.php';
		if(file_exists($r_path)){
		   include_once $r_path;
		}
	}
	
	
	/**
	**加载include文件夹下的类
	*/
	function include_autoload($className){
	    $i_path=ROOT_PATH.'/include/'.$className.'.php';
		if(file_exists($i_path)){
		   include_once $i_path;
		}
	}
	
	//最重要的一步
	spl_autoload_register('require_autoload');
	spl_autoload_register('include_autoload');

通过以上三步,你的require文件夹和include文件夹中存放的类文件,在被脚本调用的时候将会自动被加载。
在需要实例化的时候只需要直接new就行了,比如:
$a=new Animal();此时会自动加载Animal.php进来,但前提是Animal.php文件确实存在于require或include文件夹中,且有Animal类。

  1. 综合应用:封装一个自动加载类
//新建Autoload.php
	//代码如下:
	class Autoload{
	       public function __construct(){
		        $this->register();
		   }
	
	       /**
		   ** $className 类名
		   ** $r_path    类文件存放目录1
		   ** $i_path    类文件存放目录2
		   */
		   private function _autoload($className){//$className必须有
		      $r_path=ROOT_PATH.'/require/'.$className.'.php';//定义类文件存放目录1
		      $i_path=ROOT_PATH.'/include/'.$className.'.php';//定义类文件存放目录2
			  
			  //在目录1中查找类文件,找不到就去目录2中找,两个目录中都找不到就提示“类文件不存在!”。
			  if(file_exists($r_path)){
			     include_once $r_path; 
			  }elseif(file_exists($i_path)){
			     include_once $i_path;
			  }else{
			    die($className.'类文件不存在!');
			  }
		   }
		   
		   private function register(){ 
		        spl_autoload_register(array(__CLASS__,'_autoload'));
		   }
	}

测试:
新建两个文件夹分别命名为:include、require。
1、在include中新建Animal.php,代码如下:

class Animal{
		public function __construct(){
			 echo __METHOD__; 
		}
}

在require文件夹中新建Human.php,代码如下:

class Human{
		public function __construct(){
			echo __METHOD__;	 
		}
	}

在Autoload.php中类主体之外添加如下代码测试能否自动加载Animal和Human类

$load=new Autoload();
$a=new Animal();
echo '<hr />';
$h=new Human();

输出的内容如下:
Animal::__construct
=============================================================================
Human::__construct

还望大佬们不要笑话,有不对的或者值得改进的地方请留言告诉我以便我能学习、进步.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值