php object oriented,PHP学习记录之面向对象(Object-oriented programming,OOP)基础【接口、抽象类、静态方法等】...

本文实例讲述了PHP面向对象(Object-oriented programming,OOP)基础。分享给大家供大家参考,具体如下:

我们可以使用接口(interface),指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容,我们可以通过 interface 关键字来定义,就像定义一个标准的类一样,但其中定义所有的方法都是空的,但是其中定义的所有方法都必须是公有,这是接口的特性。

但是我们如果要实现一个接口,就得使用 implements 操作符,并且类中必须实现接口中定义的所有方法,否则会报一个致命错误,其中类还可以实现多个接口,用逗号来分隔多个接口的名称,是不是很神奇???来看实例感受下:

// 声明一个'iTemplate'接口

interface iTemplate

{

public function setVariable($name, $var);

public function getHtml($template);

}

// 实现接口

class Template implements iTemplate

{

private $vars = array();

public function setVariable($name, $var)

{

$this->vars[$name] = $var;

}

public function getHtml($template)

{

foreach($this->vars as $name => $value) {

$template = str_replace('{' . $name . '}', $value, $template);

}

return $template;

}

}

我们可以把在类中始终保持不变的值定义为常量,但是在定义和使用常量的时候不需要使用 $ 符号。需要注意的就是,常量的值必须是一个定值,不能是变量,类属性,数学运算的结果或函数调用。自 PHP 5.3.0 起,我们可以用一个变量来动态调用类,但该变量的值不能为关键字(如 self,parent 或 static),来看实例感受下:

class MyClass

{

const constant = '常量值';

function showConstant() {

echo self::constant . PHP_EOL;

}

}

echo MyClass::constant . PHP_EOL;

$classname = "MyClass";

echo $classname::constant . PHP_EOL; // 自 5.3.0 起

$class = new MyClass();

$class->showConstant();

echo $class::constant . PHP_EOL; // 自 PHP 5.3.0 起

?>

任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的,并且,定义为抽象的类不能被实例化,完事呢,被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现,这是抽象类的一些公知的概念。

但是当继承一个抽象类的时候,子类必须定义父类中的所有抽象方法,另外,这些方法的访问控制必须和父类中一样(或者更为宽松)。举个栗子,例如某个抽象方法被声明为受保护的,那么子类中实现的方法就应该声明为受保护的或者公有的,而不能定义为私有的,了解了之后咱们就来看下实例:

abstract class AbstractClass

{

// 强制要求子类定义这些方法

abstract protected function getValue();

abstract protected function prefixValue($prefix);

// 普通方法(非抽象方法)

public function printOut() {

print $this->getValue() . PHP_EOL;

}

}

class ConcreteClass1 extends AbstractClass

{

protected function getValue() {

return "ConcreteClass1";

}

public function prefixValue($prefix) {

return "{$prefix}ConcreteClass1";

}

}

class ConcreteClass2 extends AbstractClass

{

public function getValue() {

return "ConcreteClass2";

}

public function prefixValue($prefix) {

return "{$prefix}ConcreteClass2";

}

}

$class1 = new ConcreteClass1;

$class1->printOut();

echo $class1->prefixValue('FOO_') . PHP_EOL;

$class2 = new ConcreteClass2;

$class2->printOut();

echo $class2->prefixValue('FOO_') . PHP_EOL;

?>

输出结果为:

ConcreteClass1

FOO_ConcreteClass1

ConcreteClass2

FOO_ConcreteClass2

我们还要记得,子类方法可以包含父类抽象方法中不存在的可选参数,举个栗子,例如,子类定义了一个可选参数,而父类抽象方法的声明里没有,则也是可以正常运行的,如下:

abstract class AbstractClass

{

// 我们的抽象方法仅需要定义需要的参数

abstract protected function prefixName($name);

}

class ConcreteClass extends AbstractClass

{

// 我们的子类可以定义父类签名中不存在的可选参数

public function prefixName($name, $separator = ".") {

if ($name == "Pacman") {

$prefix = "Mr";

} elseif ($name == "Pacwoman") {

$prefix = "Mrs";

} else {

$prefix = "";

}

return "{$prefix}{$separator} {$name}";

}

}

$class = new ConcreteClass;

echo $class->prefixName("Pacman"), "\n";

echo $class->prefixName("Pacwoman"), "\n";

?>

输出结果为:

Mr. Pacman

Mrs. Pacwoman

声明类属性或方法为 static(静态),它可以不实例化类而直接访问,但是,静态属性不能通过一个类已实例化的对象来访问(但静态方法可以)。另外,由于静态方法不需要通过对象即可调用,所以伪变量 $this 在静态方法中不可用,也就是说,静态属性不可以由对象通过 -> 操作符来访问。自 PHP 5.3.0 起,我们可以用一个变量来动态调用类,但该变量的值不能为关键字 self,parent 或 static,实例如下:

class Foo {

public static $my_static = 'foo';

public function staticValue() {

return self::$my_static;

}

}

print Foo::$my_static . PHP_EOL;

$foo = new Foo();

print $foo->staticValue() . PHP_EOL;

?>

输出结果如下:

foo

foo

PHP 5 新增了一个 final关键字,它的作用就是,如果父类中的方法被声明为 final,则子类无法覆盖该方法,如果一个类被声明为 final,则不能被继承,如下案例,会报错的哦:

class BaseClass {

public function test() {

echo "BaseClass::test() called" . PHP_EOL;

}

final public function moreTesting() {

echo "BaseClass::moreTesting() called" . PHP_EOL;

}

}

class ChildClass extends BaseClass {

public function moreTesting() {

echo "ChildClass::moreTesting() called" . PHP_EOL;

}

}

// 报错信息 Fatal error: Cannot override final method BaseClass::moreTesting()

?>

PHP 不会在子类的构造方法中自动的调用父类的构造方法,如果需要执行父类的构造方法,我们可以在子类的构造方法中调用 parent::__construct(),如下:

class BaseClass {

function __construct() {

print "BaseClass 类中构造方法" . PHP_EOL;

}

}

class SubClass extends BaseClass {

function __construct() {

parent::__construct(); // 子类构造方法不能自动调用父类的构造方法

print "SubClass 类中构造方法" . PHP_EOL;

}

}

class OtherSubClass extends BaseClass {

// 继承 BaseClass 的构造方法

}

// 调用 BaseClass 构造方法

$obj = new BaseClass();

// 调用 BaseClass、SubClass 构造方法

$obj = new SubClass();

// 调用 BaseClass 构造方法

$obj = new OtherSubClass();

?>

输出结果为:

BaseClass 类中构造方法

BaseClass 类中构造方法

SubClass 类中构造方法

BaseClass 类中构造方法

好啦,本次记录就到这里了。

希望本文所述对大家PHP程序设计有所帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/405828.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java虚拟机-内存分配策略

Java技术体系中所提倡的自动内存管理策略最终可以归结为自动化地解决了两个问题:给对象分配内存以及回收分配给对象的内存; 几条普遍的分配规则:1、对象优先在Eden区分配年轻代分为三个区:1个Eden区2个Survivor区。大部分对象在Ed…

Source Insight常用的快捷键

From: http://blog.21ic.com/user1/4251/archives/2008/53650.html Source Insight常用的快捷键: Ctrl :Jump to definition Ctrl/ :Look up reference F3 : search backward F4 : search forward F5: go to Line F7 :Look up symbols F8 :Look up local symbols F…

ubuntu 安装fcitx输入法(3.6和4.0bate)

Ubuntu 10.10默认安装的输入法是ibus,在安装中文语言包(http://blog.csdn.net/wangjingfei/archive/2010/05/21/5614203.aspx)之后就可以使用。但是查看了一些网上的资料说是ibus有很多问题,例如会造成Linux QQ崩溃等。不知道是ibus的问题还是…

php在菜单栏里加子菜单,WordPress后台添加子菜单add_submenu_page()

接上文:WordPress后台添加顶级菜单add_menu_page(),今儿再分享一下在 wordpress 后台侧边栏添加子菜单的方法,用到的函数是:add_submenu_page()函数用法:add_submenu_page( $parent_slug, $page_title, $menu_title, $…

C#String详解

字符串:stringLength - 字符串的长度。 TrimStart() 压缩空格即消除字符串开始空格TrimEnd() 消除结尾空格Trim() 同时消除开头和结尾空格。注:中间空格不消除,因为英文单词之间用空格隔开。 ToUpper() 全部变大写ToLower() 全部变小写 Repl…

linux modprobe命令参数及用法详解--linux加载模块命令

From: http://www.linuxso.com/command/modprobe.html modprobe(module probe) 功能说明:自动处理可载入模块。 语  法:modprobe [-acdlrtvV][--help][模块文件][符号名称 符号值] 补充说明:modprobe可载入指定的个别模块,…

fedora下安装pps

fedora下安装pps成功,官方下载的deb包解压,然后手动安装。大致讲一下方法,如下:到官方下载deb包,右键解压后,进入解压的文件夹,将两个tar包解压,得到etc,opt,usr,三个文件夹&#xf…

ThinkPHP整合百度Ueditor图文教程

ThinkPHP整合百度Ueditor图文教程 ThinkPHP整合百度Ueditor,基于黄永成老师的视频说明的申明:最好大家都能写绝对路径的都写好绝对路径比如:window.UEDITOR_HOME_URL 他在教程里面已经说了的,我就不再次说了啊,就一笔…

php 支付加密,关于支付时rsa加密解密的函数

//加密function _checkPadding($padding, $type) {if ($type en) {switch ($padding) {case OPENSSL_PKCS1_PADDING :$ret true;break;default :$ret false;}} else {switch ($padding) {case OPENSSL_PKCS1_PADDING :case OPENSSL_NO_PADDING :$ret true;break;default :$…

电脑延迟关机命令Shutdown详解

From: http://www.ccw.com.cn/college/soft/b2c/os/htm2010/20101208_904968.shtml 目前实现自动关机的方法主要是使用第三方软件,比较麻烦!其实,Windows自身就具备自动关机功能,它是由系统内部的 "Shutdown.exe"升序来控制的,位于"C:/windows/System32"文…

树莓派Raspberry 操作GPIO--LED

一、 安装 wiringPi : sudo apt-get install wiringPi 二、查看安装版本 三、查看端口 四、创建源文件 touch myled.c 五、编写源代码 vi myled.c 使用cat myled.c 查看 六、编译和链接wiringPi库 七、运行

SQL逗号分隔的字段统计(摘自网络)

前言:由于很多业务表因为历史原因或者性能原因,都使用了违反第一范式的设计模式。即同一个列中存储了多个属性值(具体结构见下表)。这种模式下,应用常常需要将这个列依据分隔符进行分割,并得到列转行的结果…

缺少using namespace std;

错误现象&#xff1a; error C2143: syntax error : missing ; before < error C2501: list : missing storage-class or type specifiers error C2059: syntax error : < error C2039: iterator : is not a member of global namespace error C2238: unexpected token(s…

php json传输被过滤,php-the_content过滤器,用于将自定义字段添加到JSON响应

我对这个用于显示JSON API中的自定义字段的the_content过滤器感到绝望.我正在使用此插件http://wordpress.org/plugins/json-rest-api/从自定义帖子类型获得JSON响应.这些自定义帖子类型具有我必须在移动应用程序中显示的自定义字段.为了实现这一点,我编写了以下代码,该代码使用…

Ubuntu 和 Centos 的一点差别

1、 centos使用yum的方式&#xff0c;而Ubuntu使用apt-get 方式&#xff08;Raspberry也是&#xff09; 2、centos支持rpm包&#xff0c;但Ubuntu不支持 3、Ubuntu桌面系统比Centos好看&#xff0c;二者都有桌面系统和服务器系统 4、Ubuntu普通用户可以采用sudo执行root命令…