ThinkPHP 关于namespace的事儿

如题,php通常是不允许函数重名的,例如a.php中有一个getName(),b.php中有一个getName(),在require_once a.php和b.php后就会报getName重复定义的错误。改错误可以通过rename函数名来解决,或者通过namespace来解决。看下面的代码:

1 <?php
 2 
 3 function getName(){
 4   echo ‘getName 111‘;  
 5 }
 6 
 7 function getName(){
 8   echo ‘getName 222‘;  
 9 }
11 
12 ?>

这个代码是会报错函数重复定义错误的。可以通过下面的方式修改

1 namespace t1;
 2   function getName(){
 3     echo ‘getName 111‘;  
 4   }
 5   
 6 namespace t2;
 7   function getName(){
 8     echo ‘getName 222‘;  
 9   }
10 
11 echo getName();
12 echo t1\getName();
13 echo \t1\getName();

通过命名空间 t1和t2来隔离getName函数,在下面的echo getName()会执行t2的getName函数,因为这种输出会查找最近的namespace的对于函数。

echo t1\getName()会报错,因为程序会查找最近的namespace,也就是真正执行的是 echo \t2\t1\getName()这个,在t2下没有t1\getName所以报错。

echo \t1\getName()执行t1的getName方法。

上面还可以通过use namespace的方式来解决

将echo t1\getName()修改为

use t1;

echo getName()也能解决问题。

在来看下面一段代码

1 namespace t1;
 2 class Person{
 3   function getName(){
 4     return "t1.person.name";
 5   }    
 6 }
 7 
 8 namespace t2;
 9 class Person{
10   function getName(){
11     return "t2.person.name";
12   }
13 } 
14 
15 use t1\Person;
16 Person::getName();

在最后Person::getName()时会发生错误,提示Person已经定义不能重复定义。原因是use t1\Person;把t1的Person类引入到了当前最近的namespace t2中,但是t2中已经存在Person类了,因此发生冲突,产生错误。解决办法如下

use t1\Person as Per;

Per::getName();

该代码使用as关键字,将引入的t1名称空间下的Person类重名命成了Per因此避免了和t2下的Person发生冲突。

时间: 2024-10-03 13:22:32

ThinkPHP 关于namespace的事儿的相关文章

thinkphp的那点事儿(笔记)

ThinkPHP(3.2.3版本)是基于MVC模式的并支持多层mvc的架构设计 M 项目目录/应用目录/Home/Model V 项目目录/应用目录/View C 项目目录/应用目录/Home/Controller 首先引入单入口文件  URL模式 1.PATHINFO 模式    http ://域名/项目名/入口文件/模块名/方法名/键1/值1/键2/值2 2.普通模式    http://域名/项目名/入口文件?m=模块名&a=方法名&键1=值1&键2=值2 3.REWRIT

thinkphp autoload 命名空间自定义 namespace

使用thinkPHP过程中,一些自定义的类库和第三方类库需要找一个合适的位置放置,放到系统默认的org文件夹感觉不太好,破坏了thinkPHP的原生目录. 就看了一下官方手册,可以在模块或者应用的配置文件里自定义类库的命名空间. 不过使用中需要注意的是,你的自定义的命名空间名称需要和你的文件夹名称相对应,不能更改. 然后测试一下

用thinkphp将网络上的图片下载到本地服务器

我用的thinkphp版本是3.2.3,这个版本的跟更早些版本的调用方法不太一样,正确的调用方法是: Demo3Controller.class <?php namespace Home\Controller; use Think\Controller; class Demo3Controller extends Controller { public function download(){ $url = "http://n.sinaimg.cn/sports/20161023/MrD2

ThinkPHP讲解(一)框架基础

ThinkPHP框架知识点过于杂乱,接下来将以问题的形势讲解tp(ThinkPHP的简写) 1.tp框架是什么,为什么使用是它? 一堆代码的集合,里边有变量.函数.类.常量,里边也有许多设计模式MVC.AR数据库.单例等等.框架可以节省我们50-60%的工作量,我们全部精力都集中在业务层次. 为什么使用框架 框架可以帮组我们快速.稳定.高效搭建程序系统 该系统由于框架的使用使得本身的维护性.灵活性.适应客户需求方面得到最大化的增强. 使用框架的过程中可以使得我们的注意力全部集中业务层面,而无需关

ThinkPHP 3.2.3 加减乘法验证码类

ThinkPHP 3.2.3 自带的验证码类位于 /ThinkPHP/Library/Think/Verify.class.php,字体文件位于 /ThinkPHP/Library/Think/Verify/ 可以在 Verify.class.php 文件内进行修改,也可以单独写一个类继承自带的验证码类.如果单独写一个继承的类,可以重用父类的属性和方法,但是要注意的是父类中有一些属性和方法是私有(private)的,可以修改这些私有的属性和方法为保护(protected)的,如果不希望修改框架自

ThinkPHP 3.2.3 简单后台模块开发(一)常用配置

一.项目分组 下载解压 ThinkPHP 3.2.3,在默认的应用 Application(./Application) 中,包含一个默认的模块 Home(./Application/Home). 需要在该默认应用中创建一个用于后台管理的 Admin 模块,可以通过在应用入口文件(./index.php)中绑定 Admin 模块来 自动生成 Admin 模块: define('BIND_MODULE','Admin'); 此时访问 http://serverName/index.php 便会自动

Thinkphp中文水印和图片水印合体集成插件

今天给大家分享一下中文水印和图片水印合体集成插件,Thinkphp只有单独的加文字或加图片,由于工作的需要需要同里加"文字"和"图片"于是,试着修改了一下,只需要一行代码解决图片和文字水印.首先引入Thinkphp的Image方法即可,而且支持中文水印. 1.前端模板:前端原图片和加过水印的图片显示对比<p class="notice red">原图:</p><img src="Public/images/

ThinkPHP整合支付宝即时到账接口调用

首先是在支付宝的蚂蚁金服开放平台下载PHP的demo: 1 https://doc.open.alipay.com/doc2/detail?treeId=62&articleId=103566&docType=1 下载地址如上,里面有个MD5加密方式UTF8的PHP的demo可以拿来用,可以直接在localhost上跑,传入合适的参数即使体验支付一次,这点和微信支付接口调用的demo相同. 现在我们尝试将其中demo的lib类文件整合到thinkphp之中去. 将四个lib改名放入Vend

Thinkphp 控制器

控 制 器: 1.命名方法:新建一个主页面的控制器 controller文件夹下新建一个文件,命名为:MainController.class.php首字母都大写,称为驼峰命名法 eg: <?php namespace Home\Controller; use Think\Controller; class MainController extends Controller { public function XianShi() { echo "主页面显示"; } } 2. C(