PHP 命名空间 namespace 函数调用 类引用 详解

PHP namespace 命名空间 函数调用 类引用 详细测试分析

本文测试中,假设index.php页面和test.php页面在同一个根目录下,方便加载test.php页面。

前提条件都是在namespace A;下进行测试。

namespace A;
use B\D, C\E as F;

// 函数调用
foo();      // 首先尝试调用定义在命名空间"A"中的函数foo()
\foo();     // 调用全局空间函数 "foo"
my\foo();   // 调用定义在命名空间"A\my"中函数 "foo"
F();        // 首先尝试调用定义在命名空间"A"中的函数 "F"
B\foo();    // 调用命名空间 "A\B" 中函数 "foo"
B::foo();   // 调用命名空间 "A" 中定义的类 "B" 的 "foo" 方法
D::foo();   // 使用导入规则,调用命名空间 "B" 中定义的类 "D" 的 "foo" 方法
\B\foo();   // 调用命名空间 "B" 中的函数 "foo"
\B::foo();  // 调用全局空间中的类 "B" 的 "foo" 方法
A\B::foo();   // 调用命名空间 "A\A" 中定义的类 "B" 的 "foo" 方法
\A\B::foo();  // 调用命名空间 "A\B" 中定义的类 "B" 的 "foo" 方法

//类引用
new B();    // 创建命名空间 "A" 中定义的类 "B" 的一个对象
new D();    // 使用导入规则,创建命名空间 "B" 中定义的类 "D" 的一个对象
new F();    // 使用导入规则,创建命名空间 "C" 中定义的类 "E" 的一个对象
new \B();   // 创建定义在全局空间中的类 "B" 的一个对象
new \D();   // 创建定义在全局空间中的类 "D" 的一个对象
new \F();   // 创建定义在全局空间中的类 "F" 的一个对象

函数调用

1当前命名空间A下函数调用 语法 foo();

index.php页面

<?php
namespace A;
header("content-type:text/html;charset=utf-8");
require ‘test.php‘;//加载定义命名空间"A\my"的页面
function foo(){
    echo ‘我是命名空间"A"中的函数foo()‘;
}
// 函数调用
foo();      // 首先尝试调用定义在命名空间"A"中的函数foo()
            // 再尝试调用全局函数 "foo"

结果为

我是命名空间"A"中的函数foo()

2当前命名空间A下调用命名空间"A\my"中的函数foo()  语法 my\foo();

index.php页面

<?php
namespace A;
header("content-type:text/html;charset=utf-8");
require ‘test.php‘;//加载定义命名空间"A\my"的页面
//调用函数
my\foo();   // 调用定义在命名空间"A\my"中函数 "foo"
?>

test.php页面(定义命名空间"A\my"的页面)

<?php 
namespace A\my;
 function foo(){
     echo ‘我是命名空间"A\my"中的函数foo()‘;
 }
?>

结果为

我是命名空间"A\my"中的函数foo()

3.当前命名空间A下调用命名空间 "A\B"的函数"foo"

语法

require ‘test.php‘;//加载命名空间 "A\B"的函数"foo"文件

B\foo();

index.php页面

<?php
namespace A;
header("content-type:text/html;charset=utf-8");
use B\D, C\E as F;
require ‘test.php‘;//加载命名空间 "A\B"的函数"foo"文件
B\foo();    // 调用命名空间 "A\B" 中函数 "foo"
?>

test.php页面(定义命名空间 "A\B"的函数"foo"的页面)

<?php 
namespace A\B;
function foo(){
    echo ‘命名空间 "A\B" 中函数 "foo"‘;
}
?>

结果为

命名空间 "A\B" 中函数 "foo"

4.当前命名空间A下调用本命名空间 "A" 中定义的类 "B" 的 "foo" 静态方法

语法

B::foo();

index.php页面

<?php
namespace A;
header("content-type:text/html;charset=utf-8");
use B\D, C\E as F;

class B{
   static  public function foo(){
        echo ‘命名空间 "A" 中定义的类 "B" 的 "foo" 方法‘;
    }
}

B::foo();   // 调用命名空间 "A" 中定义的类 "B" 的 "foo" 方法
            // 如果未找到类 "A\B" ,则尝试自动装载类 "A\B"
?>

结果为

命名空间 "A" 中定义的类 "B" 的 "foo" 方法

5.当前命名空间A下调用本命名空间 "B" 中定义的类 "D" 的 "foo" 静态方法

语法

require ‘test.php‘;   //加载文件

use B\D;                //引导类

D::foo();                //进行调用

index.php页面

<?php
namespace A;
header("content-type:text/html;charset=utf-8");
require ‘test.php‘;
use B\D, C\E as F;
D::foo();   // 使用导入规则,调用命名空间 "B" 中定义的类 "D" 的 "foo" 方法
            // 如果类 "B\D" 未找到,则尝试自动装载类 "B\D"
?>

test.php页面(定义命名空间 "B"的类"D"的函数"foo"的页面)

<?php
namespace B;
class D{
static public function foo(){
echo ‘命名空间 "B" 中定义的类 "D" 的 "foo" 方法‘;
}
}
?>

结果为

命名空间 "B" 中定义的类 "D" 的 "foo" 方法

6.当前命名空间A下调用命名空间 "B"的函数"foo"

语法

require ‘test.php‘;//加载命名空间 "B"的函数"foo"文件

\B\foo();

index.php页面

<?php
namespace A;
header("content-type:text/html;charset=utf-8");
use B\D, C\E as F;
require ‘test.php‘;//加载命名空间 "B"的函数"foo"文件
\B\foo();    // 调用命名空间 "B" 中函数 "foo"
?>

test.php页面(定义命名空间 "B"的函数"foo"的页面)

<?php 
namespace B;
function foo(){
    echo ‘命名空间 "B" 中函数 "foo"‘;
}
?>

结果为

命名空间 "B" 中函数 "foo"

7.当前命名空间A下调用全局空间 "B"的函数"foo"静态方法

语法

require ‘test.php‘;//加载全局空间 "B"的函数"foo"文件

\B::foo();

index.php页面

<?php
namespace A;
header("content-type:text/html;charset=utf-8");
use B\D, C\E as F;
require ‘test.php‘;//加载全局空间 "B"的函数"foo"文件
\B::foo();  // 调用全局空间中的类 "B" 的 "foo" 方法
            // 如果类 "B" 未找到,则尝试自动装载类 "B"
?>

test.php页面(定义全局空间 "B"的函数"foo"的页面)

<?php 
class B{
    static public function foo(){
        echo ‘全局空间的B类中foo方法‘;
    }
}
?>

结果为

全局空间的B类中foo方法

8.当前命名空间A下调用命名空间 "A\A"的B类"foo"静态方法

语法

require ‘test.php‘;//加载命名空间 "A\A"的B类"foo"静态方法文件

A\B::foo();

index.php页面

<?php
namespace A;
header("content-type:text/html;charset=utf-8");
use B\D, C\E as F;
require ‘test.php‘;//加载命名空间 "A\A"的B类"foo"静态方法文件
A\B::foo();   // 调用命名空间 "A\A" 中定义的类 "B" 的 "foo" 方法
              // 如果类 "A\A\B" 未找到,则尝试自动装载类 "A\A\B"
?>

test.php页面(定义命名空间 "A\A"的B类"foo"静态方法的页面)

<?php 
namespace A\A;
class B{
    static public function foo(){
        echo ‘命名空间A\A中B类foo方法‘;
    }
}
?>

结果为

命名空间A\A中B类foo方法

9.当前命名空间A下调用命名空间 "A\B"的B类"foo"静态方法

语法

require ‘test.php‘;//加载命名空间 "A\B"的B类"foo"静态方法文件

\A\B::foo();

index.php页面

<?php
namespace A;
header("content-type:text/html;charset=utf-8");
require ‘test.php‘;//加载命名空间 "A\B"的B类"foo"静态方法文件
\A\B::foo();  // 调用命名空间 "A\B" 中定义的类 "B" 的 "foo" 方法
              // 如果类 "A\B" 未找到,则尝试自动装载类 "A\B"
?>

test.php页面(定义命名空间 "A\B"的B类"foo"静态方法的页面)

<?php 
namespace A\B;
class B{
    static public function foo(){
        echo ‘命名空间A\B中B类的foo静态方法‘;
    }
}
?>

结果为

命名空间A\B中B类的foo静态方法

类引用

1当前命名空间A下本空间类引用  语法 $b=new B();

index.php页面

<?php
namespace A;
header("content-type:text/html;charset=utf-8");
use B\D, C\E as F;

class B{
    public $name=‘我是命名空间 "A" 中定义的类 "B" 的一个对象‘;
}

$b=new B();    // 创建命名空间 "A" 中定义的类 "B" 的一个对象
              // 如果未找到,则尝试自动装载类 "A\B"
echo $b->name;

结果为

我是命名空间 "A" 中定义的类 "B" 的一个对象

2当前命名空间A下命名空间 "B" 中定义的类 "D"引用

语法

use B\D        //导入命名空间B中的D类

$b=new D();

index.php页面

<?php
namespace A;
header("content-type:text/html;charset=utf-8");
use B\D, C\E as F;
require ‘test.php‘;//加载命名空间B中的D类的文件
$d=new D();    // 使用导入规则,创建命名空间 "B" 中定义的类 "D" 的一个对象
            // 如果未找到,则尝试自动装载类 "B\D"
echo $d->name;
?>

test.php页面(定义命名空间B中D类的页面)

<?php 
namespace B;
 class D{
     public $name=‘命名空间B中D类‘;
 }
?>

结果为

命名空间B中D类

3当前命名空间A下命名空间 "C" 中定义的类 "E"引用

语法

use C\E as F        //导入命名空间C中的E类  F为命名空间 "C" 中定义的类 "E"的别名

$b=new F();

index.php页面

<?php
namespace A;
header("content-type:text/html;charset=utf-8");
use B\D, C\E as F;
require ‘test.php‘;//加载命名空间C中的E类的文件
$f=new F();    // 使用导入规则,创建命名空间 "C" 中定义的类 "E" 的一个对象
            // 如果未找到,则尝试自动装载类 "C\E"
echo $f->name;
?>

test.php页面(定义命名空间C中E类的页面)

<?php 
namespace C;
 class E{
     public $name=‘命名空间C中E类‘;
 }
?>

结果为

命名空间C中E类

4当前命名空间A下全局空间中定义的类 "B","D" "F"引用

语法

require ‘test.php‘;//加载全局空间中定义的类 "B","D" "F"文件

$b=new \B();  //    \  表示绝对路径引用  全局空间中定义的类

$d=new \D();

$f=new \F();

index.php页面

<?php
namespace A;
header("content-type:text/html;charset=utf-8");
use B\D, C\E as F;
require ‘test.php‘;//加载全局空间中定义的类 "B","D" "F"文件

$b=new \B();   // 创建定义在全局空间中的类 "B" 的一个对象
            // 如果未发现,则尝试自动装载类 "B"

$d=new \D();   // 创建定义在全局空间中的类 "D" 的一个对象
            // 如果未发现,则尝试自动装载类 "D"
 
$f=new \F();   // 创建定义在全局空间中的类 "F" 的一个对象
            // 如果未发现,则尝试自动装载类 "F"
echo $b->name;
echo ‘<br/>‘;
echo $d->name;
echo ‘<br/>‘;
echo $f->name;
?>

test.php页面(全局空间中定义的类 "B","D" "F"的页面)

<?php 
class B{
    public $name=‘全局空间的类B‘;
}
class D{
    public $name=‘全局空间的类D‘;
}
class F{
    public $name=‘全局空间的类F‘;
}
?>

结果为

全局空间的类B
全局空间的类D
全局空间的类F

附录

<?php
namespace A;
use B\D, C\E as F;
 
// 函数调用
 
foo();      // 首先尝试调用定义在命名空间"A"中的函数foo()
            // 再尝试调用全局函数 "foo"
 
\foo();     // 调用全局空间函数 "foo" 
 
my\foo();   // 调用定义在命名空间"A\my"中函数 "foo" 
 
F();        // 首先尝试调用定义在命名空间"A"中的函数 "F" 
            // 再尝试调用全局函数 "F"
 
// 类引用
 
new B();    // 创建命名空间 "A" 中定义的类 "B" 的一个对象
            // 如果未找到,则尝试自动装载类 "A\B"
 
new D();    // 使用导入规则,创建命名空间 "B" 中定义的类 "D" 的一个对象
            // 如果未找到,则尝试自动装载类 "B\D"
 
new F();    // 使用导入规则,创建命名空间 "C" 中定义的类 "E" 的一个对象
            // 如果未找到,则尝试自动装载类 "C\E"
 
new \B();   // 创建定义在全局空间中的类 "B" 的一个对象
            // 如果未发现,则尝试自动装载类 "B"
 
new \D();   // 创建定义在全局空间中的类 "D" 的一个对象
            // 如果未发现,则尝试自动装载类 "D"
 
new \F();   // 创建定义在全局空间中的类 "F" 的一个对象
            // 如果未发现,则尝试自动装载类 "F"
 
// 调用另一个命名空间中的静态方法或命名空间函数
 
B\foo();    // 调用命名空间 "A\B" 中函数 "foo"
 
B::foo();   // 调用命名空间 "A" 中定义的类 "B" 的 "foo" 方法
            // 如果未找到类 "A\B" ,则尝试自动装载类 "A\B"
 
D::foo();   // 使用导入规则,调用命名空间 "B" 中定义的类 "D" 的 "foo" 方法
            // 如果类 "B\D" 未找到,则尝试自动装载类 "B\D"
 
\B\foo();   // 调用命名空间 "B" 中的函数 "foo" 
 
\B::foo();  // 调用全局空间中的类 "B" 的 "foo" 方法
            // 如果类 "B" 未找到,则尝试自动装载类 "B"
 
// 当前命名空间中的静态方法或函数
 
A\B::foo();   // 调用命名空间 "A\A" 中定义的类 "B" 的 "foo" 方法
              // 如果类 "A\A\B" 未找到,则尝试自动装载类 "A\A\B"
 
\A\B::foo();  // 调用命名空间 "A\B" 中定义的类 "B" 的 "foo" 方法
              // 如果类 "A\B" 未找到,则尝试自动装载类 "A\B"
?>
时间: 2024-07-28 14:42:20

PHP 命名空间 namespace 函数调用 类引用 详解的相关文章

Java记录 -22- Java的基类Object详解

Java的基类Object详解 Java的JDK文档要经常查阅使用,最好查看英文的文档. java.lang.Object 类,java.lang包在使用的时候无需显示导入,编译时由编译器自动帮助我们导入. API(Application Programinga Interface),应用编程接口. Object obj = new Object(); System.out.println(obj); System.out.println(obj.toString()); 上面打印的两个内容一样

强引用、软引用、弱引用、虚引用详解

强引用.软引用.弱引用.虚引用详解 先说一下垃圾回收机制GabageCollection: GC是垃圾收集的意思(GabageCollection).和JAVA一样,ANDROID系统也是由GC来自动回收内存的.android中一个应用的启动,android系统都会为这个应用分配一个dalivk虚拟机,以便这个应用运行在这个独立的虚拟机上,可是一个虚拟机内存大小一般也是限制的(20M左右).可见,一个应用的运行所申请的内存不可能无限大的. 通常,GC是在一个单独的比较低优先 级线程中运行.这样其

CSS3伪类选择器详解

前面花了两节内容分别在<CSS3基本选择器>和<CSS3属性选择器详解>介绍了CSS3选择器中的基本选择器和属性选择器使用方法,今天要和大家一起学习CSS3选择器中的第三部分,也是最后一部分——伪类选择器.伪类选择器对于大家来说最熟悉的莫过于:link,:focus,:hover之类的了,因为这些在平时中是常用到的伪类选择器,那么先和大家一起简单总结一下CSS中常用的伪类选择器的使用方法,最后把重心放到CSS3新增加的":nth-child"选择器的使用方法.

C# Oracle数据库操作类实例详解

本文所述为C#实现的Oracle数据库操作类,可执行超多常用的Oracle数据库操作,包含了基础数据库连接.关闭连接.输出记录集.执行Sql语句,返回带分页功能的dataset .取表里字段的类型和长度等,同时还有哈稀表自动插入数据库等高级任务.需要特别指出的是:在执行SQL语句,返回 DataReader之前一定要先用.read()打开,然后才能读到数据,再用hashTable对数据库进行insert,update,del操作,注意此时只能用默认的数据库连接"connstr". 本文

C++引用(&amp;)详解

C++引用详解 引用的概念 引用:就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样. 引用的声明方法:类型标识符 &引用名=目标变量名: 如下:定义引用ra,它是变量a的引用,即别名. int a; int &ra=a; (1)&在此不是求地址运算符,而是起标识作用. (2)类型标识符是指目标变量的类型. (3)声明引用时,必须同时对其进行初始化. (4)引用声明完毕后,相当于目标变量有两个名称即该目标原名称和引用名,且不能再把该引用名作为其他变量名的别名. (

php中关于引用(&amp;)详解

php中关于引用(&)详解 php的引用(就是在变量或者函数.对象等前面加上&符号) 在PHP 中引用的意思是:不同的变量名访问同一个变量内容. 与C语言中的指针是有差别的.C语言中的指针里面存储的是变量的内容在内存中存放的地址. 变量的引用 PHP 的引用允许你用两个变量来指向同一个内容 <?php $a="ABC"; $b =&$a; echo $a;//这里输出:ABC echo $b;//这里输出:ABC $b="EFG"; e

PHP的引用详解【转】

摘自:http://www.cnblogs.com/xiaochaohuashengmi/archive/2011/09/10/2173092.html 官方文档: 1.引用是什么:http://www.php.net/manual/zh/language.references.whatare.php 2.引用做什么:http://www.php.net/manual/zh/language.references.whatdo.php3.引用传递:http://www.php.net/manua

Linux学习笔记--Linux文件管理类名利详解

Linux文件管理类命令详解 目录管理: ls.cd.pwd.mkdir.rmdir.tree 文件管理: touch.stat.file.rm.cp.mv.nano 日期管理: touch.clock.hwclock.cal 查看文本: cat.tac.more.less.head.tail cat:连接并显示 -n:在显示时显示每一行的行号 -E:在每行结束处显示 $ Ctrl+C:结束命令 分屏显示: more.less more:向后翻 less: q退出命令 head:查看前n行 ta

halcon导出类---HDevWindowStack详解

在HDevelop中编写好的程序在导出时,Halcon会帮我们转换成我们需要的语言,比如C++.例:HDevelop中有如下语句需要导出: dev_close_window() Halcon导出成C++语言就成了如下语句: if (HDevWindowStack::IsOpen()) close_window(HDevWindowStack::Pop()); 了解MFC的应该不难理解,这两句在底层做了什么!下面让我来讲解一下,呵呵 首先来看看HDevWindowStack这个类,其实这个类很简单