命名空间学习~~~

是参考:http://www.chinaz.com/program/2010/0309/108172.shtml大神的,加入了一点点自己的理解和疑惑.....

定义命名空间:

lib3.php

<?php
//<strong>定义命名空间的前面不能有代码,不然会报错</strong>
namespace app;
class lib
{
	function __construct()
	{
		echo "lib3";
	}
}
?>
命名空间的作用:

在lib3中定义了一个lib类,如果要是新建一个文件lib2,在lib2里面定义一个类lib,当在lib1文件中require---lib2文件时,就会报错,这时可以使用命名空间

lib1.php

<?php
namespace lib1;
require './lib2.php';
class lib
{
	function __construct()
	{
		echo "lib1";
	}
}
$obj=new \lib();//这个类是实例化的lib2文件的lib类
<pre name="code" class="php">$obj=new lib();//这个lib类是实例化的lib1文件的lib类
?>

 加上\的意思是使用全局的lib类,就是没有定义命名空间的类(不知道说清楚没有....) 

<?php
class lib
{
	function __construct()
	{
		echo "lib2";
	}
}
?>
感觉命名空间就是避免了因为名称而导致的冲突


两个文件都定义了命名控件

lib1.php

<?php
namespace lib1;
require './lib2.php';
class lib
{
	function __construct()
	{
		echo "lib1";
	}
}
//要使用lib2文件里面的lib就需要这样使用了
$obj_1=new \lib2\lib();
//在当前命名控件直接new不加‘\’的话就是使用当前命名空间的类
$obj_2=new lib();
?>
lib2.php

<?php
namespace lib2;
class lib
{
	function __construct()
	{
		echo "lib2";
	}
}
?>


命名空间导入

lib1.php

<?php
namespace lib1;
use app\lib2;//导入lib2文件的命名空间
use app;//导入lib3文件的命名控件
require './lib2.php';
require './lib3.php';
class lib
{
	function __construct()
	{
		echo "lib1";
	}
}
//要使用lib2文件里面的lib就需要这样使用了,可以看出,导入命名控件之后,只需要使用最后一个“\”之后的命名空间名称就能使用命名控件内的内容
$obj_1=new lib2\lib();
//要使用lib3文件里面的lib就需要这样使用了
$obj_3=new app\lib();
//在当前命名控件直接new不加‘\’的话就是使用当前命名空间的类
$obj_2=new lib();
?>
lib2.php

<?php
namespace app\lib2;
class lib
{
	function __construct()
	{
		echo "lib2";
	}
}
?>
lib3.php

<?php
namespace app;
class lib
{
	function __construct()
	{
		echo "lib3";
	}
}
?>
个人总结:use导入命名空间的作用就是不需要再在要使用另外命名空间里面的内容的时候大量的打字~~~

命名空间别名

lib1php

<?php
namespace lib1;
use app\lib2 as A;//导入lib2文件的命名空间并取别名
use app;//导入lib3文件的命名控件
require './lib2.php';
require './lib3.php';
class lib
{
	function __construct()
	{
		echo "lib1";
	}
}
//要使用lib2文件里面的lib就需要这样使用了,可以看出,导入命名控件之后,只需要使用最后一个“\”之后的命名空间名称就能使用命名控件内的内容
//这里已经取了别名了,用别名来使用该命名空间内的内的内容
$obj_1=new A\lib();
//要使用lib3文件里面的lib就需要这样使用了
$obj_3=new app\lib();
//在当前命名控件直接new不加‘\’的话就是使用当前命名空间的类
$obj_2=new lib();
?>
个人总结:别名的作用就是更加减少了引用其他命名空间内容的麻烦~~~~

PHP命名空间高级特性

__NAMESPACE__常量

这个值可以用来生成一个完全限定类名

<?php
namespace lib1;
use app\lib2 as A;//导入lib2文件的命名空间
use app;//导入lib3文件的命名控件
require './lib2.php';
require './lib3.php';
class lib
{
	function __construct()
	{
		echo "lib1";
	}
}
//这里的后面连接的类不能有括号"()"不然会报错
$obj_str=__NAMESPACE__.'\\lib';
//这里是实例化的当前文件的lib类
$obj=new $obj_str;
?>
当要实例化的类需要传入参数时

<?php
namespace lib1;
use app\lib2 as A;//导入lib2文件的命名空间
use app;//导入lib3文件的命名控件
require './lib2.php';
require './lib3.php';
class lib
{
	function __construct($a)
	{
		echo "lib1";
	}
}
//<pre name="code" class="php">//这里的后面连接的类不能有括号"()"不然会报错
$obj_str=__NAMESPACE__.'\\lib';
//填参数在后面填就ok了
$obj=new $obj_str(1);?>

 
namespace关键字 

:用于明确引用一个当前命名空间或子命名空间中的项目,它等价于类中的self命名空间:

<?php
namespace lib1;
use app\lib2 as A;//导入lib2文件的命名空间
use app;//导入lib3文件的命名控件
require './lib2.php';
require './lib3.php';
require './lib4.php';
class lib
{
	function __construct()
	{
		echo "lib1";
	}
}
//这里是使用的lib4文件的对象(应该就是子空间),但是还不如$obj=new lib4\lib();来的简短
$obj=new namespace\lib4\lib();
//这里是用的当前命名空间的lib,但是还不如$obj=new lib();来的简短
$obj=new namespace\lib();
?>
这个namspace关键字到底是什么用啊???

自动载入命名空间类

目录结构如下

lib1.php

<?php
namespace App\Class_1;
class lib1
{
	function __construct()
	{
		echo "lib1";
	}
}
?>

lib2.php

<?php
namespace App\Class_1;
class lib2
{
	function __construct()
	{
		echo "lib2";
	}
}
?>

lib3.php

<?php
namespace App\Class_2;
class lib3
{
	function __construct()
	{
		echo "lib3";
	}
}
?>

lib4.php

<?php
namespace App\Class_2;
class lib4
{
	function __construct()
	{
		echo "lib4";
	}
}
?>

main.php

<?php
use App\Class_1 as A;
use App\Class_2 as B;
$obj=new A\lib1();
$obj=new A\lib2();
$obj=new B\lib3();
$obj=new B\lib4();
function __autoload($class_name){
	$path= './'.str_replace('\\', '/', $class_name).'.php';
	require_once $path;
}
?>
这样就可以自动加载require文件了,不用一个个手动加载,

注意:类名要和文件名一致


命名空间的学习暂时告一段落~~~~~





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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值