如题,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 }

 

 ?>

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

 1 namespace t1;

 2   function getName(){

 3     echo 'getName 111';  

 4   }

 5   

 6 namespace t2;

 7   function getName(){

 8     echo 'getName 222';  

 9   }

 

 echo getName();

 echo t1\getName();

 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{
   function getName(){
     return "t2.person.name";
   }
 } 
 
 use t1\Person;
 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发生冲突。

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

  1. 第7章 数据库访问与ORM 慕课网微信小程序开发学习笔记

    第7章 数据库访问与ORM https://coding.imooc.com/learn/list/97.html 目录: 7-1 数据库操作三种方式之原生SQL 19:09 7-2 从一个错误了解E ...

  2. thinkphp autoload 命名空间自定义 namespace

    使用thinkPHP过程中,一些自定义的类库和第三方类库需要找一个合适的位置放置,放到系统默认的org文件夹感觉不太好,破坏了thinkPHP的原生目录. 就看了一下官方手册,可以在模块或者应用的配置 ...

  3. utf-8 bom头问题 thinkphp 报错 Namespace declaration statement has to be the very first statement in the script

    先看百度百科上的解释---- BOM —— Byte Order Mark,中文名译作“字节顺序标记”.在这里找到一段关于 BOM 的说明: 在UCS 编码中有一个叫做 "Zero Widt ...

  4. [ThinkPHP]报错:Fatal error: Namespace declaration statement has to be the very first statement or after any declare call in the script in E:\wamp\www\jdlh\application\index\controller\Index.php on line

    错误提示说命名空间声明语句必须是第一句,可我看就是第一句没毛病呀,这是为啥呢,后面发现<?php 前面有个空格,删掉就正常了 去掉空格之后页面能正常显示

  5. THINKPHP源码学习--------文件上传类

    TP图片上传类的理解 在做自己项目上传图片的时候一直都有用到TP的上传图片类,所以要进入源码探索一下. 文件目录:./THinkPHP/Library/Think/Upload.class.php n ...

  6. THINKPHP源码学习--------验证码类

    TP3.2验证码类的理解 今天在学习中用到了THINKPHP验证码,为了了解究竟,就开始阅读TP验证码的源码. 源码位置:./ThinkPHP/Library/Think/Verify.class.p ...

  7. ThinkPhp 3.2 自动验证

    自动验证是ThinkPHP模型层提供的一种数据验证方法,可以在使用create创建数据对象的时候自动进行数据验证. 数据验证有两种方式: 静态方式:在模型类里面通过$_validate属性定义验证规则 ...

  8. ThinkPhp 3.2 CRUD操作

    创建数据对象 ThinkPHP可以帮助你快速地创建数据对象,最典型的应用就是自动根据表单数据创建数据对象,这个优势在一个数据表的字段非常之多的情况下尤其明显. 很简单的例子: // 实例化User模型 ...

  9. ThinkPhp 3.2 常见问题与注意事项

    1 命名空间声明必须写在脚本的最前面 如果运行PHP脚本后出现如下错误: Namespace declaration statement has to be the very first statem ...

随机推荐

  1. SQLALchemy(连表)、paramiko

    本节内容:

  2. 创建html模板

    打开写好的html 复制  在页面上右击------属性  --会出现下面情况

  3. 网站统计中的数据收集原理及实现(share)

    转载自:http://blog.codinglabs.org/articles/how-web-analytics-data-collection-system-work.html 网站数据统计分析工 ...

  4. 集合视图 UICollectionView

    什么是UICollectionView UICollectionView是一种新的数据展示方式,简单来说可以把他理解成多列的UITableView(请一定注意这是UICollectionView的最最 ...

  5. web前端的学习.

    web前端的了解 1.前端技术包括JavaScript.ActionScript.CSS.xHTML等“传统”技术与Adobe AIR.Google Gears,以及概念性较强的交互式设计,艺术性较强 ...

  6. Eclipse+Tomcat搭建https环境

    一.首先在本地建立一个keystore文件 用命令:keytool -v -genkey -alias tomcat -keyalg RSA -keystore c:/tomcat.keystore ...

  7. 安装ftp 服务器

    安装ftp 服务器 #yum install vsftp 安装ftp 客户端 重启ftp服务器 sudo /etc/init.d/vsftpd restart /start /stop 进行ARM 和 ...

  8. 连接列值 mysql CONCAT函数

    mysql concat(str1,str2,...) 返回结果为连接参数产生的字符串,如果任何一个参数带有null,则返回结果为null.如果所有参数均为非二进制字符串,则结果为非二进制字符串. 如 ...

  9. shh简化

    对于SSH框架中部分的操作简化我分为两大类: 一:操作 1. 在SSH的struts.xml里 name="Action类_*" class="注入的实例"(同 ...

  10. UIView详解

    MVC架构模式   MVC(Model-View-Controller)是实现数据和显示数据的视图分离的架构模式(有一定规模的应用都应该实现数据和显示的分离).其中,M代表模型,就是程序中使用的数据和 ...