对属性或方法的访问控制,是通过在前面添加关键字public(公有),protected(受保护)或private(私有)来实现的。被定义为公有的类成员可以在任何地方被访问。被定义为受保护的类成员则可以被其自身以及其子类和父类访问。被定义为私有的类成员则只能被其定义所在的类访问。一、属性的访问控制类属性必须定义为公有,受保护,私有之一。如果用 var 定义,则被视为公有。Example#1属性声明classMyClass{public$p...
继续阅读 >
分类目录归档:全部列表
2014
11-07
11-07
PHP基础之类和对象7——对象继承
继承已为大家所熟知的一个程序设计特性,PHP的对象模型也使用了继承。继承将会影响到类与类,对象与对象之间的关系。比如,当扩展一个类,子类就会继承父类所有公有的和受保护的方法。除非子类覆盖了父类的方法,被继承的方法都会保留其原有功能。继承对于功能的设计和抽象是非常有用的,而且对于类似的对象增加新功能就无须重新再写这些公用的功能。Note:除非使用了自动加载,否则一个类必须在使用之前被定义。如果一个类扩...
继续阅读 >
2014
11-07
11-07
PHP基础之类和对象8——范围解析操作符(::)
范围解析操作符(也可称作PaamayimNekudotayim)或者更简单地说是一对冒号,可以用于访问静态成员,类常量,还可以用于覆盖类中的属性和方法。当在类定义之外引用到这些项目时,要使用类名。自PHP5.3.0起,可以通过变量来引用类,该变量的值不能是关键字(如 self,parent 和 static)。把PaamayimNekudotayim选作双冒号操作符的名字似乎有些奇怪。然而,这是Zend开发小组在写ZendEngine0.5(被用于PHP3中)...
继续阅读 >
2014
11-07
11-07
PHP基础之类和对象9——static关键字
本页说明了用static关键字来定义静态方法和属性。static也可用于定义静态变量以及后期静态绑定。声明类属性或方法为静态,就可以不实例化类而直接访问。静态属性不能通过一个类已实例化的对象来访问(但静态方法可以)。为了兼容PHP4,如果没有指定访问控制,属性和方法默认为公有。由于静态方法不需要通过对象即可调用,所以伪变量$this在静态方法中不可用。静态属性不可以由对象通过->操作符来访问。用静态方式调...
继续阅读 >
2014
11-07
11-07
PHP基础之类和对象10——抽象类
PHP5支持抽象类和抽象方法。定义为抽象的类不能被实例化。任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的。被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现。继承一个抽象类的时候,子类必须定义父类中的所有抽象方法;另外,这些方法的访问控制必须和父类中一样(或者更为宽松)。例如某个抽象方法被声明为受保护的,那么子类中实现的方法就应该声明为受...
继续阅读 >
2014
11-07
11-07
PHP基础之类和对象11——对象接口
使用接口(interface),可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容。接口是通过 interface 关键字来定义的,就像定义一个标准的类一样,但其中定义所有的方法都是空的。接口中定义的所有方法都必须是公有,这是接口的特性。实现(implements)要实现一个接口,使用 implements 操作符。类中必须实现接口中定义的所有方法,否则会报一个致命错误。类可以实现多个接口,用逗号来分隔多个接口的名称...
继续阅读 >
2014
11-07
11-07
PHP基础之类和对象12——Traits专题
自PHP5.4.0起,PHP实现了代码复用的一个方法,称为traits。Traits是一种为类似PHP的单继承语言而准备的代码复用机制。Trait为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用方法集。Traits和类组合的语义是定义了一种方式来减少复杂性,避免传统多继承和混入类(Mixin)相关的典型问题。Traits和一个类相似,但仅仅旨在用细粒度和一致的方式来组合功能。Trait不能通过它自身来实例化...
继续阅读 >
2014
11-07
11-07
PHP基础之类和对象13——重载
PHP所提供的"重载"(overloading)是指动态地"创建"类属性和方法。我们是通过魔术方法(magicmethods)来实现的。当调用当前环境下未定义或不可见的类属性或方法时,重载方法会被调用。所有的重载方法都必须被声明为 public。注意:1)这些魔术方法的参数都不能通过引用传递。2)PHP中的"重载"与其它绝大多数面向对象语言不同。传统的"重载"是用于提供多个同名的类方法,但各方法的参数类型和个数不同。属性重载publicvo...
继续阅读 >
2014
11-07
11-07
PHP基础之类和对象14——遍历对象
PHP5提供了一种定义对象的方法使其可以通过单元列表来遍历,例如用 foreach 语句。默认情况下,所有可见属性都将被用于遍历。Example#1简单的对象遍历classMyClass{public$var1=1;public$var2=2;public$var3=3;protected$protected='protectedvar';private$private='privatevar';functioniterateVisible(){echo"MyClass::iterateVisible:<br>";foreach($this...
继续阅读 >
2014
11-07
11-07
PHP基础之类和对象15——魔术方法
__construct(),__destruct(),__call(),__callStatic(),__get(),__set(),__isset(),__unset(),__sleep(),__wakeup(),__toString(),__invoke(),__set_state()和 __clone() 等方法在PHP中被称为"魔术方法"(Magicmethods)。在命名自己的类方法时不能使用这些方法名,除非是想使用其魔术功能。PHP将所有以__(两个下划线)开头的类方法保留为魔术方法。所以在定义类方法时,除了上述魔术方法,建议不要以__为...
继续阅读 >
2014
11-07
11-07
PHP基础之类和对象16——Final关键字
PHP5新增了一个final关键字。如果父类中的方法被声明为final,则子类无法覆盖该方法。如果一个类被声明为final,则不能被继承。Example#1Final方法示例classBaseClass{publicfunctiontest(){echo"BaseClass::test()called<br>";}finalpublicfunctionmoreTesting(){echo"BaseClass::moreTesting()called<br>";}}classChildClassextendsBaseClass{publicfunctionmore...
继续阅读 >
2014
11-07
11-07
PHP基础之类和对象17——对象复制
在多数情况下,我们并不需要完全复制一个对象来获得其中属性。但有一个情况下确实需要:如果你有一个GTK窗口对象,该对象持有窗口相关的资源。你可能会想复制一个新的窗口,保持所有属性与原来的窗口相同,但必须是一个新的对象(因为如果不是新的对象,那么一个窗口中的改变就会影响到另一个窗口)。还有一种情况:如果对象A中保存着对象B的引用,当你复制对象A时,你想其中使用的对象不再是对象B而是B的一个副本,那...
继续阅读 >
2014
11-07
11-07
PHP基础之类和对象18——对象比较
PHP5中的对象比较要比PHP4中复杂,所期望的结果更符合一个面向对象语言。当使用比较运算符(==)比较两个对象变量时,比较的原则是:如果两个对象的属性和属性值都相等,而且两个对象是同一个类的实例,那么这两个对象变量相等。而如果使用全等运算符(===),这两个对象变量一定要指向某个类的同一个实例(即同一个对象)。通过下面的示例可以理解以上原则。Example#1PHP5的对象比较<?phpfunctionbool2str($boo...
继续阅读 >
2014
11-07
11-07
PHP基础之类和对象19——类型约束
PHP5可以使用类型约束。函数的参数可以指定必须为对象(在函数原型里面指定类的名字),接口,数组(PHP5.1起)或者 callable(PHP5.4起)。不过如果使用NULL 作为参数的默认值,那么在调用函数的时候依然可以使用 NULL 作为实参。如果一个类或接口指定了类型约束,则其所有的子类或实现也都如此。类型约束不能用于标量类型如 int 或 string。Traits 也不允许。Example#1类型约束示例<?php//如下面的类...
继续阅读 >
2014
11-07
11-07
PHP基础之类和对象20——后期静态绑定
自PHP5.3.0起,PHP增加了一个叫做后期静态绑定的功能,用于在继承范围内引用静态调用的类。准确说,后期静态绑定工作原理是存储了在上一个“非转发调用”(non-forwardingcall)的类名。当进行静态方法调用时,该类名即为明确指定的那个(通常在 :: 运算符左侧部分);当进行非静态方法调用时,即为该对象所属的类。所谓的“转发调用”(forwardingcall)指的是通过以下几种方式进行的静态调用:self::,parent::,static...
继续阅读 >
2014
11-07
11-07
PHP基础之类和对象21——对象和引用
在php5的对象编程经常提到的一个关键点是“默认情况下对象是通过引用传递的”。但其实这不是完全正确的。下面通过一些例子来说明。php的引用是别名,就是两个不同的变量名字指向相同的内容。在php5,一个对象变量已经不再保存整个对象的值。只是保存一个标识符来访问真正的对象内容。当对象作为参数传递,作为结果返回,或者赋值给另外一个变量,另外一个变量跟原来的不是引用的关系,只是他们都保存着同一个标识符的拷贝,这个...
继续阅读 >
2014
11-07
11-07
PHP基础之类和对象22——对象序列化
所谓的序列化对象就是在会话中存放对象所有php里面的值都可以使用函数 serialize()来返回一个包含字节流的字符串来表示。 unserialize()函数能够重新把字符串变回php原来的值。序列化一个对象将会保存对象的所有变量,但是不会保存对象的方法,只会保存类的名字。为了能够 unserialize()一个对象,这个对象的类必须已经定义过。如果序列化类A的一个对象,将会返回一个跟类A相关,而且包含了对象所有变量值的字符串。如果要...
继续阅读 >
2014
11-07
11-07
PHP基础之命名空间1——命名空间概述及定义
命名空间概述什么是命名空间?从广义上来说,命名空间是一种封装事物的方法。在很多地方都可以见到这种抽象概念。例如,在操作系统中目录用来将相关文件分组,对于目录中的文件来说,它就扮演了命名空间的角色。具体举个例子,文件 foo.txt 可以同时在目录/home/greg 和 /home/other 中存在,但在同一个目录中不能存在两个 foo.txt 文件。另外,在目录 /home/greg 外访问 foo.txt 文件时,我们必须将目录名以及目录分...
继续阅读 >
2014
11-07
11-07
PHP基础之命名空间2——在同一个文件中定义多个命名空间
也可以在同一个文件中定义多个命名空间。在同一个文件中定义多个命名空间有两种语法形式。Example#1定义多个命名空间,简单组合语法<?phpnamespaceMyProject;constCONNECT_OK=1;classConnection{/*...*/}functionconnect(){/*...*/}namespaceAnotherProject;constCONNECT_OK=1;classConnection{/*...*/}functionconnect(){/*...*/}?>不建议使用这种语法...
继续阅读 >
2014
11-07
11-07
PHP基础之命名空间3——命名空间使用基础
在讨论如何使用命名空间之前,必须了解PHP是如何知道要使用哪一个命名空间中的元素的。可以将PHP命名空间与文件系统作一个简单的类比。在文件系统中访问一个文件有三种方式:相对文件名形式如foo.txt。它会被解析为 currentdirectory/foo.txt,其中currentdirectory表示当前目录。因此如果当前目录是 /home/foo,则该文件名被解析为/home/foo/foo.txt。相对路径名形式如subdirectory/foo.txt。它会被解析为 currentdir...
继续阅读 >
2014
11-07
11-07
PHP基础之命名空间4——命名空间和动态语言特征
PHP命名空间的实现受到其语言自身的动态特征的影响。因此,如果要将下面的代码转换到命名空间中:Example#1动态访问元素example1.php:<?phpclassclassname{function__construct(){echo__METHOD__,"\n";}}functionfuncname(){echo__FUNCTION__,"\n";}constconstname="global";$a='classname';$obj=new$a;//printsclassna...
继续阅读 >
PHP支持两种抽象的访问当前命名空间内部元素的方法,__NAMESPACE__ 魔术常量和namespace关键字。常量__NAMESPACE__的值是包含当前命名空间名称的字符串。在全局的,不包括在任何命名空间中的代码,它包含一个空的字符串。Example#1__NAMESPACE__示例,在命名空间中的代码<?phpnamespaceMyProject;echo'"',__NAMESPACE__,'"';//输出"MyProject"?>Example#2__NAMESPACE__示例,全局代码<?phpecho'...
继续阅读 >
2014
11-07
11-07
PHP基础之命名空间6——使用别名和导入
允许通过别名引用或导入外部的完全限定名称,是命名空间的一个重要特征。这有点类似于在类unix文件系统中可以创建对其它的文件或目录的符号连接。PHP命名空间支持有两种使用别名或导入方式:为类名称使用别名,或为命名空间名称使用别名。注意PHP不支持导入函数或常量。在PHP中,别名是通过操作符 use 来实现的。下面是一个使用所有可能的三种导入方式的例子:Example#1使用use操作符导入/使用别名<?phpnamespace...
继续阅读 >
2014
11-07
11-07
PHP基础之命名空间7——全局空间
如果没有定义任何命名空间,所有的类与函数的定义都是在全局空间,与PHP引入命名空间概念前一样。在名称前加上前缀 \ 表示该名称是全局空间中的名称,即使该名称位于其它的命名空间中时也是如此。Example#1使用全局空间说明<?phpnamespaceA\B\C;/*这个函数是A\B\C\fopen*/functionfopen(){/*...*/$f=\fopen(...);//调用全局的fopen函数return$f;}?>...
继续阅读 >