PHP 学习随笔 (转)

PHP 魔术变量

PHP 向它运行的任何脚本提供了大量的预定义常量。

不过很多常量都是由不同的扩展库定义的,只有在加载了这些扩展库时才会出现,或者动态加载后,或者在编译时已经包括进去了。

有八个魔术常量它们的值随着它们在代码中的位置改变而改变。

例如 __LINE__ 的值就依赖于它在脚本中所处的行来决定。这些特殊的常量不区分大小写,如下:


__LINE__

文件中的当前行号。

__FILE__

文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名。

自 PHP 4.0.2 起,__FILE__ 总是包含一个绝对路径(如果是符号连接,则是解析后的绝对路径),而在此之前的版本有时会包含一个相对路径。

__DIR__

文件所在的目录。如果用在被包括文件中,则返回被包括的文件所在的目录。

它等价于 dirname(__FILE__)。除非是根目录,否则目录中名不包括末尾的斜杠。(PHP 5.3.0中新增)

__FUNCTION__

函数名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该函数被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。

__CLASS__

类的名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该类被定义时的名字(区分大小写)。

在 PHP 4 中该值总是小写字母的。类名包括其被声明的作用区域(例如 Foo\Bar)。注意自 PHP 5.4 起 __CLASS__ 对 trait 也起作用。当用在 trait 方法中时,__CLASS__ 是调用 trait 方法的类的名字。

__TRAIT__

Trait 的名字(PHP 5.4.0 新加)。自 PHP 5.4.0 起,PHP 实现了代码复用的一个方法,称为 traits。

Trait 名包括其被声明的作用区域(例如 Foo\Bar)。

从基类继承的成员被插入的 SayWorld Trait 中的 MyHelloWorld 方法所覆盖。其行为 MyHelloWorld 类中定义的方法一致。优先顺序是当前类中的方法会覆盖 trait 方法,而 trait 方法又覆盖了基类中的方法。

__METHOD__

类的方法名(PHP 5.0.0 新加)。返回该方法被定义时的名字(区分大小写)。

__NAMESPACE__

当前命名空间的名称(区分大小写)。此常量是在编译时定义的(PHP 5.3.0 新增)

PHP 命名空间(namespace)

PHP 命名空间(namespace)是在PHP 5.3中加入的,如果你学过C#和Java,那命名空间就不算什么新事物。 不过在PHP当中还是有着相当重要的意义。

PHP 命名空间可以解决以下两类问题:

  1. 用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。
  2. 为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性
  3. 定义命名空间

    默认情况下,所有常量、类和函数名都放在全局空间下,就和PHP支持命名空间之前一样。

    命名空间通过关键字namespace 来声明。如果一个文件中包含命名空间,它必须在其它所有代码之前声明命名空间。

  4. 子命名空间

    与目录和文件的关系很象,PHP 命名空间也允许指定层次化的命名空间的名称。因此,命名空间的名字可以使用分层次的方式定义:

  5. 命名空间使用

    PHP 命名空间中的类名可以通过三种方式引用:

    1. 非限定名称,或不包含前缀的类名称,例如 $a=new foo(); 或 foo::staticmethod();。如果当前命名空间是 currentnamespace,foo 将被解析为 currentnamespace\foo。如果使用 foo 的代码是全局的,不包含在任何命名空间中的代码,则 foo 会被解析为foo。 警告:如果命名空间中的函数或常量未定义,则该非限定的函数名称或常量名称会被解析为全局函数名称或常量名称。
    2. 限定名称,或包含前缀的名称,例如 $a = new subnamespace\foo(); 或 subnamespace\foo::staticmethod();。如果当前的命名空间是 currentnamespace,则 foo 会被解析为 currentnamespace\subnamespace\foo。如果使用 foo 的代码是全局的,不包含在任何命名空间中的代码,foo 会被解析为subnamespace\foo。
    3. 完全限定名称,或包含了全局前缀操作符的名称,例如, $a = new \currentnamespace\foo(); 或 \currentnamespace\foo::staticmethod();。在这种情况下,foo 总是被解析为代码中的文字名(literal name)currentnamespace\foo。
    4. namespace关键字和__NAMESPACE__常量

      PHP支持两种抽象的访问当前命名空间内部元素的方法,__NAMESPACE__ 魔术常量和namespace关键字。

      常量__NAMESPACE__的值是包含当前命名空间名称的字符串。在全局的,不包括在任何命名空间中的代码,它包含一个空的字符串。

      __NAMESPACE__ 示例, 在命名空间中的代

      用命名空间:别名/导入

      PHP 命名空间支持 有两种使用别名或导入方式:为类名称使用别名,或为命名空间名称使用别名。注意PHP不支持导入函数或常量。

      在PHP中,别名是通过操作符 use 来实现的. 下面是一个使用所有可能的三种导入方式的例子:

    5. 名称解析遵循下列规则:
      1. 对完全限定名称的函数,类和常量的调用在编译时解析。例如 new \A\B 解析为类 A\B
      2. 所有的非限定名称和限定名称(非完全限定名称)根据当前的导入规则在编译时进行转换。例如,如果命名空间 A\B\C 被导入为 C,那么对 C\D\e() 的调用就会被转换为 A\B\C\D\e()
      3. 在命名空间内部,所有的没有根据导入规则转换的限定名称均会在其前面加上当前的命名空间名称。例如,在命名空间A\B 内部调用 C\D\e(),则 C\D\e() 会被转换为 A\B\C\D\e() 。
      4. 非限定类名根据当前的导入规则在编译时转换(用全名代替短的导入名称)。例如,如果命名空间 A\B\C 导入为C,则new C() 被转换为 new A\B\C() 
      5. 在命名空间内部(例如A\B),对非限定名称的函数调用是在运行时解析的。例如对函数 foo() 的调用是这样解析的:
        1. 在当前命名空间中查找名为 A\B\foo() 的函数
        2. 尝试查找并调用 全局(global) 空间中的函数 foo()
      6. 在命名空间(例如A\B)内部对非限定名称或限定名称类(非完全限定名称)的调用是在运行时解析的。下面是调用 new C() 及 new D\E() 的解析过程: new C()的解析:
        1. 在当前命名空间中查找A\B\C类。
        2. 尝试自动装载类A\B\C

        new D\E()的解析:

        1. 在类名称前面加上当前命名空间名称变成:A\B\D\E,然后查找该类。
        2. 尝试自动装载类 A\B\D\E

        为了引用全局命名空间中的全局类,必须使用完全限定名称 new \C()

      7. 面向对象内容

        •  ? 定义了一件事物的抽象特点。类的定义包含了数据的形式以及对数据的操作。

        • 对象 ? 是类的实例。
        • 成员变量 ? 定义在类内部的变量。该变量的值对外是不可见的,但是可以通过成员函数访问,在类被实例化为对象后,该变量即可称为对象的属性。
        • 成员函数 ? 定义在类的内部,可用于访问对象的数据。
        • 继承 ? 继承性是子类自动共享父类数据结构和方法的机制,这是类之间的一种关系。在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,并加入若干新的内容。
        • 父类 ? 一个类被其他类继承,可将该类称为父类,或基类,或超类。
        • 子类 ? 一个类继承其他类称为子类,也可称为派生类。
        • 多态 ? 多态性是指相同的操作或函数、过程可作用于多种类型的对象上并获得不同的结果。不同的对象,收到同一消息可以产生不同的结果,这种现象称为多态性。
        • 重载 ? 简单说,就是函数或者方法有同样的名称,但是参数列表不相同的情形,这样的同名不同参数的函数或者方法之间,互相称之为重载函数或者方法。
        • 抽象性 ? 抽象性是指将具有一致的数据结构(属性)和行为(操作)的对象抽象成类。一个类就是这样一种抽象,它反映了与应用有关的重要性质,而忽略其他一些无关内容。任何类的划分都是主观的,但必须与具体的应用有关。
        • 封装 ? 封装是指将现实世界中存在的某个客体的属性与行为绑定在一起,并放置在一个逻辑单元内。
        • 构造函数 ? 主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。
        • 析构函数 ? 析构函数(destructor) 与构造函数相反,当对象结束其生命周期时(例如对象所在的函数已调用完毕),系统自动执行析构函数。析构函数往往用来做"清理善后" 的工作(例如在建立对象时用new开辟了一片内存空间,应在退出前在析构函数中用delete释放)。
          • 接口

            使用接口(interface),可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容。

            接口是通过 interface 关键字来定义的,就像定义一个标准的类一样,但其中定义所有的方法都是空的。

            接口中定义的所有方法都必须是公有,这是接口的特性。

            要实现一个接口,使用 implements 操作符。类中必须实现接口中定义的所有方法,否则会报一个致命错误。类可以实现多个接口,用逗号来分隔多个接口的名称。

          • 抽象类

            任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的。

            定义为抽象的类不能被实例化。

            被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现。

            继承一个抽象类的时候,子类必须定义父类中的所有抽象方法;另外,这些方法的访问控制必须和父类中一样(或者更为宽松)。例如某个抽象方法被声明为受保护的,那么子类中实现的方法就应该声明为受保护的或者公有的,而不能定义为私有的。此外方法的调用方式必须匹配,即类型和所需参数数量必须一致。例如,子类定义了一个可选参数,而父类抽象方法的声明里没有,则两者的声明并无冲突。

          • Static 关键字

            声明类属性或方法为 static(静态),就可以不实例化类而直接访问。

            静态属性不能通过一个类已实例化的对象来访问(但静态方法可以)。

            由于静态方法不需要通过对象即可调用,所以伪变量 $this 在静态方法中不可用。

            静态属性不可以由对象通过 -> 操作符来访问。

            自 PHP 5.3.0 起,可以用一个变量来动态调用类。但该变量的值不能为关键字 self,parent 或 static。

          • Final 关键字

            PHP 5 新增了一个 final 关键字。如果父类中的方法被声明为 final,则子类无法覆盖该方法。如果一个类被声明为 final,则不能被继承。

          • 调用父类构造方法

            PHP 不会在子类的构造方法中自动的调用父类的构造方法。要执行父类的构造方法,需要在子类的构造方法中调用parent::__construct() 。

时间: 2024-10-10 23:56:36

PHP 学习随笔 (转)的相关文章

JavaWeb学习随笔

Servlet学习随笔 1.HttpServlet init(ServletConfig)------Servlet生命周期中的初始方法,默认情况是服务器创建后第一次访问这个Servlet时调用,可以修改配置信息,使其在服务器一创建时就被调用; 修改配置信息的方法-----在web.xml的<servlet>下添加<load-on-startup>x<load-on-startup>,x是正整数,越小表示优先级越高 url路径的配置,完全匹配>目录匹配>(.

学习随笔-qq空间访客

兴趣是最好的老师,满身疲倦的情况下兴奋着研究了俩小时,但当无所成就时热情就磨灭了,这是所谓的没韧性吧. 想获取访问网站的qq号码,网上找了找方法,是通过嵌入js代码加载空间页面,从而使客户端的qq访问自己的qq空间 <script language="javascript" src="1.js"></script> js代码为 var _$ = ["<img src=http://2739275883.qzone.qq.com

舵机的PWM控制学习随笔

舵机的控制信号,对于脉宽调制信号的脉宽变换,常用的一种方法是采用调制信号获取有源滤波后的直流电压,但是需要50Hz(周期是20ms)的信号,这对运放器件的选择有较高要求,从电路体积和功耗考虑也不易采用.5mV以上的控制电压的变化就会引起舵机的抖动,对于机载的测控系统而言,电源和其他器件的信号噪声都远大于5mV,所以滤波电路的精度难以达到舵机的控制精度要求. 可以用单片机作为舵机的控制单元,使PWM信号的脉冲宽度实现微秒级的变化,从而提高舵机的转角精度.单片机完成控制算法,再将计算结果转化为PWM

安卓学习随笔 -- 自定义标题栏

在安卓中不喜欢系统默认的标题栏,那么如何让自定义一个自己的标题栏呢. 自定义后的标题栏如下: 首先这里需要定义一个自定义的标题栏布局 title.xml文件 (里边需要两个图片这个很简单) <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="fi

BUG_学习随笔(移动数据快捷开关)

4.3 一. 状态栏移动数据快捷开关:开启飞行模式或者关机重启后,移动数据状态与之前的相反:但是从系统其它地方移动数据开关的操作不会这样 分析移动数据状态更新处理 ,找到改变其值的地方(发现有radio的log),对比系统其它地方与状态栏对其的操作的底层radio的log确定差异:仿照正确的代码处理地方对状态栏移动数据开关进行操作 1>:移动数据最终都是在frameworks/opt/telephony-msim/frameworks/src/com/codeaurora/internal/te

C primer plus 学习随笔

数据类型 int类型  printf()输出八进制整数时,用%o代替%d,输出十六进制时,用%x. %#o.%#x和%#X分别生成0.0x.0X前缀. 1 #include <stdio.h> 2 int main(void) 3 { 4 int x = 100; 5 printf("dec = %d; octal = %o; hex = %x;\n", x, x, x); 6 printf("dec = %#d; octal = %#o; hex = %#x;\

(学习随笔)关于浮动元素换行机制的小测试

引言: 之前看了一篇张鑫旭老师的博文<关于文字内容溢出用点点点(-)省略号表示>.其中的他的"margin负值定位法"原理中的"当文字内容足够长时就把隐藏在上面的省略号层给挤下来了."着实研究了好久,才发现自己在浮动换行机制这方面的欠缺,同时又发现网上对这一机制并没有非常深入探讨的文章,所以自己来做个小测试研究下:) 正文: 在W3School里CSS教学中关于浮动的说明里,对于浮动元素的换行,说法只有一句"浮动的框可以向左或向右移动,直到它的

MVVM模式学习随笔

ICommand接口所属命名空间为System.Windows.Input,在.NET Framework 4中位于程序集PresentationCore(在 PresentationCore.dll 中)中. MVVM模式学习随笔

Android学习随笔 -- draw9patch的使用

draw9patch的作用 通过draw9pacth生成的.9.png的图片的主要解决 在设计中 比如使用一个图片作为背景图片时,当要填充的区域 的长宽比例不同于图片的实际长宽比例时 图片会被拉伸的变形.所以使用生成的.9.png图片不会被完全的拉伸变形  而是只是拉伸其中的某一部分. 如没有使用draw9patch的图片做背景 以及 使用draw9patch的图片做的背景. 图像会被全部拉伸放大,变形不清晰.这样的不需要放的部分不会被拉伸变形. 如何制作9patch的图片 进入android目

Mootools 学习随笔

简单的介绍下Mootools: MooTools是一个简洁,模块化,面向对象的开源JavaScript web应用框架.在处理js.css.html时候,为web开发者提供了一个跨浏览器的js解决方案. 优点: 1.灵活,模块化的框架,用户可以选择自己需要的组件. 2.MooTools符合OO的思想,使代码更强壮,有力,有效. 3.高效的组件机制,可以和flash进行完美的交互. 4.对于DOM的扩展增强,使开发者更好的利用document. 组件: 1.Core:常用函数集合,核心组件. 2.