thinkphp model命名同一命名空间中得类名可以相同吗

7548人阅读
ThinkPHP自3.2开始,源码便加入了命名空间,现在项目中用到的是3.0版本的,为了与时俱进,于是便学了下命名空间的知识,这里记录下今晚学到的很误解的地方。
class classname {
function __construct() {
echo __METHOD__,&&br/&\n&;
$obj = new \namespacename\classname();
上面代码打印namespacename\classname::__construct,没有问题。
class classname {
function __construct() {
echo __METHOD__,&&br/&\n&;
$a = '\namespacename\classname';
$obj = new $a();上面代码打印namespacename\classname::__construct,没有问题。
class classname {
function __construct() {
echo __METHOD__,&&br/&\n&;
$a = 'namespacename\classname';
$obj = new $a(); 上面代码打印namespacename\classname::__construct,没有问题。
可接下来的eg4确出现问题了.
class classname {
function __construct() {
echo __METHOD__,&&br/&\n&;
$obj = new namespacename\classname(); 上面的代码报错了'Fatal error: Class 'namespacename\namespacename\classname' not found in D:\server\www\test\1404\ff2.php on line 14',怎么使用字符串可以,为什么直接写就不行了呢???
class classname {
function __construct() {
echo __METHOD__,&&br/&\n&;
$obj = new classname();
上面代码打印namespacename\classname::__construct,也没有问题。
可接下来把上述这个例子变换下就出现问题了。
class classname {
function __construct() {
echo __METHOD__,&&br/&\n&;
$a = 'classname';
$obj = new $a();
上面的代码报错了'Fatal error: Class 'classname' not found in D:\server\www\test\1404\ff2.php on line 14',找不到类。在平时写代码过程中,为了动态调用类,也经常是用字符串这种写法,为什么会报错呢?
好吧,感觉有点绕,明天继续看看。
刚刚看了下官方手册,给了如下的解法,__NAMESPACE__常量和namespace关键字
__NAMESPACE__用于动态创建名称,改一下eg4的代码
class classname {
function __construct() {
echo __METHOD__,&&br/&\n&;
$a = __NAMESPACE__ . '\classname'
$obj = new $a();
运行下就成功了。
关键字 namespace 可用来显式访问当前命名空间或子命名空间中的元素,也 即是调用时使用,仍然是改eg4的例子
class classname {
function __construct() {
echo __METHOD__,&&br/&\n&;
$obj = new namespace\classname(); 运行下也就成功了。
今天又仔细看了下官方的教程,明白了昨晚的eg4的错误,$obj = new namespacename\classname();这处代码是在当前的namespacename命名空间下,且是限定名称,在解析时是这样的namespacename\namespacename\classname(),由于脚本里没有这个类,于是解析错误便报错。而$a = 'namespacename\classname';这个可以成功,是因为这属于命名空间的动态方法范畴,“因为在动态的类名称、函数名称或常量名称中,限定名称和完全限定名称没有区别,因此其前导的反斜杠是不必要的。”也就是说,类名是动态的情况下此类写法在编译时是合法的,可以找的的。同时,再看eg6的代码,官方教程中说明了,在命名空间中,使用动态语言特征,需必须使用完全限定名称(包括命名空间前缀的类名称),因此直接使用类名在编译时不成功的。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:229158次
积分:3058
积分:3058
排名:第8010名
原创:119篇
评论:79条为何命名空间里的use后面没有as - PHP当前位置:& &&&为何命名空间里的use后面没有as为何命名空间里的use后面没有as&&网友分享于:&&浏览:0次为啥命名空间里的use后面没有as大家知道命名空间里的use语法规则规定其后面必须跟as起个别名,但是thinkphp官方代码中却没有跟as,这到底是怎么回事呢
------解决思路----------------------只要命名空间&Think&中存在&Controller&类
use&Think\Controller
use&Think\Controller&as&Controller
况且你在整个&thinkphp&代码中都不会找到&namespace&Think\Controller&这样的命名空间声明
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 12345678910 Copyright & &&版权所有君,已阅读到文档的结尾了呢~~
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
ThinkPHP3.2完全开发手册PDF[]
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口您所在位置: &
&nbsp&&nbsp&nbsp&&nbsp
thinkphp3.2.2完全开发手册.pdf355页
本文档一共被下载:
次 ,您可全文免费在线阅读后下载本文档。
文档加载中...广告还剩秒
需要金币:200 &&
thinkphp3.2.2完全开发手册
你可能关注的文档:
··········
··········
ThinkPHP 完全开发手册 版本号
上海顶想信息科技有限公司 版权所有
序言 手册阅读须知
:本手册仅针对ThinkPHP3.2.*版本 ,3.1版本的请 参 这里 请使用左右键 (
-- 和和 --
)翻页阅读 , CTRL+ALT+F
全屏阅读。
发布本资料须遵守开放出版许可协议 1.0 或者更新版本。
未经版权所有者明 授权 ,禁止发行本文档及其被实质上修改的版本。
未经版权所有者事先授权 ,禁止将此作品及其衍生作品以标准 (纸质 )书籍形式发行。
如果有兴趣再发行或再版本手册的全部或部分内容 ,不论修改过与否 ,或者有任何问题 ,请联系版权所有
对ThinkPHP有任何疑问或者建议 ,请进入官方讨论区 [ /topic ] 发布相关讨
有关ThinkPHP项 目及本文档的最新资料 ,请及时访问ThinkPHP项 目主站 。
本文档的版权归ThinkPHP文档小组所有 ,本文档及其描述的内容受有关法律的版权保护 ,对本文档内容
的任何形式的非法复制 ,泄露或散布 ,将导致相应的法律责任。
ThinkPHP一直在致力于简化企业和个人的W EB应用开发 ,您的帮助是对我们最大的支持和动力
我们的团队8年来一直在坚持不懈地努力 ,并坚持开源和免费提供使用 ,帮助开发人员更加方便的进行
WEB应用的快速开发 ,如果您对我们的成果表示认同并且觉得对你有所帮助我们愿意接受来 自各方面的捐
官方微博 - 2 -
ThinkPHP是一个快速、简单的基于MVC和面向对象的轻量级PHP开发框架 ,遵循A pache2开源协议发
布 ,从诞生以来一直秉承简洁实用的设计原则 ,在保持出色的性能和至简的代码的同时 ,尤其注重开发体
正在加载中,请稍后...

我要回帖

更多关于 thinkphp use命名空间 的文章

 

随机推荐