[源码下载]

速战速决 (4) - PHP: 类基础, 抽象类, 接口, trait

作者:webabcd

介绍
速战速决 之 PHP

  • 类基础
  • 抽象类
  • 接口
  • trait

示例
1、类的相关知识点 1(基础)
class/class1.php

<?php
/**
* 类的相关知识点 1(基础)
*
* 规范:命名空间与目录路径对应,类名与文件名对应,文件以 .class.php 为后缀名
*/ class MyClass1
{
// 类常量,没有“$”符号,不能被覆盖
const MyConstant = 'constant value';
// 静态属性
static $myStaticProperty = "static property"; // 对于属性和方法的访问控制有 private protected public(默认值)
private $_name;
private $_age; // 构造函数
// PHP 中的魔术方法(magic method)均以 __(两个下划线)开头(类似的还有 __destruct(),__call(),__callStatic(),__get(),__set(),__isset(),__unset(),__sleep(),__wakeup(),__toString(),__invoke(),__set_state() 和 __clone() 等)
function __construct()
{
echo "MyClass1 construct";
echo "<br />"; // 获取参数个数
$args_num = func_num_args(); if ($args_num == 1)
{
// $this 代表当前对象,是指向类实例的指针
$this->_name = func_get_arg(0);
}
else if ($args_num == 2)
{
$this->_name = func_get_arg(0);
$this->_age = func_get_arg(1);
}
else
{ }
} // 析构函数
function __destruct()
{
print "MyClass1 destruct";
echo "<br />";
} // 构造函数,此种方式在 PHP 5.3.3 或以上可支持
// 此种方式的构造函数也可以当做方法被调用
public function MyClass1()
{
echo "i am not a construct, i am a method";
} // 静态方法
public static function myStaticMethod()
{
return "static method";
} // 方法
public function getInfo()
{
// $this 代表当前对象,是指向类实例的指针
return "name: " . $this->_name . ", age: " . $this->_age;
} // 不直接支持方法的重载(overload),可以通过相关的魔术方法来实现(参见:class3.php)
// public function getInfo($name) { } // 带参数类型约束的方法,类型约束不能用于 int 或 string 之类的标量类型
// 本例约束了参数 $ary 必须是 array 类型
public function getFirst(array $ary)
{
return $ary[0];
}
} // 被声明为 final 的类或属性或方法,无法继承
// 只能继承一个类
final class MyClass2 extends MyClass1
{
// 构造函数可以为参数设置默认值(方法或函数也可以为参数设置默认值)
function __construct($name = "wanglei", $age = 100)
{
echo "MyClass2 construct";
echo "<br />"; // parent 代表当前类的基类
parent::__construct($name, $age); // self 代表当前类
// $this 代表当前对象,是指向类实例的指针
} // 析构函数
function __destruct()
{
print "MyClass2 destruct";
echo "<br />"; parent::__destruct();
} // 覆盖基类的同名方法(override)
public function getInfo()
{
// $this 代表当前对象,指向类实例的指针
return "MyClass2 - " . parent::getInfo();
}
} // 类的实例化
$objClass1 = new MyClass1("webabcd", 35);
// 通过 -> 调用实例方法或实例属性
echo $objClass1->getInfo();
echo "<br />";
// 通过 -> 调用实例方法或实例属性(MyClass1() 是构造函数,也可以当做方法被调用)
echo $objClass1->MyClass1();
echo "<br />"; $objClass2 = new MyClass2();
echo $objClass2->getInfo();
echo "<br />"; // instanceof - 用于判断一个对象是否是指定类的实例
if($objClass2 instanceof MyClass1)
{
echo '$objClass2 instanceof MyClass1';
echo "<br />";
} // 通过 :: 调用类常量或静态属性或静态方法
echo MyClass1::MyConstant;
echo "<br />"; // 通过 :: 调用类常量或静态属性或静态方法
echo MyClass1::$myStaticProperty;
echo "<br />"; // variable class(可变类),将变量的值作为类名
$className = 'MyClass1';
// variable method(可变方法),将变量的值作为方法名
$methodName = 'myStaticMethod';
// 通过 :: 调用类常量或静态属性或静态方法
echo $className::$methodName();
echo "<br />"; // 调用带参数类型约束的方法
echo $objClass1->getFirst(array("a", "b", "c"));
echo "<br />";

2、类的相关知识点 2(抽象类,接口,trait)
class/class2.php

<?php
/**
* 类的相关知识点 2(抽象类,接口,trait)
*/ // 抽象类
abstract class MyAbstractClass
{
// 抽象方法,子类必须定义这些方法
abstract protected function getValue1();
abstract public function getValue2($param1); // 普通方法(非抽象方法)
public function getValue0()
{
return "getValue0";
}
} // 接口
interface MyInterface1
{
// 接口常量,不能被覆盖
const MyConstant = 'constant value';
public function getValue3();
} // 接口
interface MyInterface2 extends MyInterface1
{
public function getValue4();
} // 接口
interface MyInterface3
{
public function getValue5();
} // trait(可以 use 多个,允许有实现代码,但是本身不能实例化)
trait MyTrait1
{
// 可以具有方法,静态方法,属性等
function getValue6()
{
return "getValue6";
}
} // trait(可以 use 多个,允许有实现代码,但是本身不能实例化)
trait MyTrait2
{
// 抽象方法(use 这个 trait 的类必须要定义这个方法)
abstract function getValue7();
} // trait(可以 use 多个,允许有实现代码,但是本身不能实例化)
trait MyTrait3
{
function getValue6()
{
return "getValue6";
} function getValue8()
{
return "getValue8";
}
} // 必须实现所有抽象方法和接口方法
// 类只能单继承,接口可以多继承
class MyClass1 extends MyAbstractClass implements MyInterface2, MyInterface3
{
// 可以 use 多个 trait
use MyTrait1, MyTrait2;
use MyTrait3
{
// 多 trait 间有重名的,可以指定以哪个为准
MyTrait1::getValue6 insteadof MyTrait3;
// 可以为 trait 的指定方法设置别名(调用的时候用方法名也行,用别名也行)
MyTrait3::getValue8 as alias;
} // 可以将 protected 升级为 public
public function getValue1()
{
return "getValue1";
} // 可以加参数,但是加的参数必须要有默认值
public function getValue2($param1, $param2 = 'param2')
{
return "getValue2, {$param1}, {$param2}";
} public function getValue3()
{
return "getValue3";
} public function getValue4()
{
return "getValue4";
} public function getValue5()
{
return "getValue5";
} public function getValue7()
{
return "getValue7";
}
} // 调用接口常量
echo MyInterface1::MyConstant;
echo "<br />"; $myClass1 = new MyClass1;
echo $myClass1->getValue0();
echo "<br />";
echo $myClass1->getValue1();
echo "<br />";
echo $myClass1->getValue2("webabcd");
echo "<br />";
echo $myClass1->getValue3();
echo "<br />";
echo $myClass1->getValue4();
echo "<br />";
echo $myClass1->getValue5();
echo "<br />";
echo $myClass1->getValue6();
echo "<br />";
echo $myClass1->getValue7();
echo "<br />";
echo $myClass1->getValue8();
echo "<br />";
echo $myClass1->alias();
echo "<br />";

OK
[源码下载]

速战速决 (4) - PHP: 类基础, 抽象类, 接口, trait的更多相关文章

  1. Java基础教程——接口

    接口 接口只是一种约定.--Anders 接口定义了一种规范--多个类共同的公共行为规范. 对于接口的实现者--规定了必须向外提供哪些服务 对于接口的调用者--规定了可以调用哪些服务,如何调用这些服务 ...

  2. Java基础学习笔记十二 类、抽象类、接口作为方法参数和返回值以及常用API

    不同修饰符使用细节 常用来修饰类.方法.变量的修饰符 public 权限修饰符,公共访问, 类,方法,成员变量 protected 权限修饰符,受保护访问, 方法,成员变量 默认什么也不写 也是一种权 ...

  3. python开发面向对象基础:接口类&抽象类&多态&钻石继承

    一,接口类 继承有两种用途: 一:继承基类的方法,并且做出自己的改变或者扩展(代码重用) 二:声明某个子类兼容于某基类,定义一个接口类Interface,接口类中定义了一些接口名(就是函数名)且并未实 ...

  4. python基础 抽象类(接口类)

    Python中没有接口.接口类,抽象类:定义 制定一个规范 #必须要导入from abc import ABCMeta,abstractmethod class Payment(metaclass = ...

  5. Java基础——抽象类和接口

    之所以将抽象类和接口放在一起做笔记,是因为他们之间很难区分又各自独立.在学习完Java程序设计的三大特点(封装.继承.多态)之后,我最大的收获是,慢慢理解了Java语言这种面向对象程序设计的优越性,它 ...

  6. day 25-1 接口类、抽象类、多态

    # 接口类:python 原生不支持# 抽象类:python 原生支持的 接口类 首先我们来看一个支付接口的简单例子 from abc import abstractmethod,ABCMeta #我 ...

  7. Python——接口类、抽象类

    建立一个接口类.抽象类的规范 from abc import abstractmethod,ABCMeta class Payment(metaclass=ABCMeta): # 元类 默认的元类 t ...

  8. day25:接口类和抽象类

    1,接口类和抽象类知识背景:一开始在程序界是没有这些概念的,后来就流行了一种语言叫做JAVA,JAVA是一种典型的纯面向对象的语言,JAVA写的程序都是非常适用于更庞大的项目,很多程序员就总结出了一些 ...

  9. java普通类、抽象类、接口、面向对象理解

    1.面向对象编程: 面向对象编程的语言不止java一种,还有: simula 67(第一个面向对象语言,支持单继承和一定含义的多态和部分动态绑定): Smalltalk(第一个支持动态类型的语言,支持 ...

随机推荐

  1. Log4net入门使用

    简介 几乎所有的大型应用都会有自己的用于跟踪调试的API.因为一旦程序被部署以后,就不太可能再利用专门的调试工具了.然而一个管理员可能需要有一套强大的日志系统来诊断和修复配置上的问题. 经验表明,日志 ...

  2. iOS创建安全的单例

    创建安全的单例 #import "Singleton.h" @implementation Singleton static Singleton* _instance = nil; ...

  3. php语言

    <?php//单行注释/*多行注释*///弱类型语言//var a=10;//php定义变量/*$a =10; //变量名前加$$b="hello";var_dump($a) ...

  4. 兼容各浏览器的js判断上传文件大小

    由于项目需要,在网上找了一个JS判断上传文件大小的程序,经测试兼容IE6-,Firefox10,Opera11.,safari5.,chrome17 <!DOCTYPE html> < ...

  5. VS无法设置断点的解决方案

    第一种情况的处理 第二种情况的处理

  6. Ruby之入门(一)

    前言 这门语言很少去听过,可能是没怎么用到就不会听到太多关于ruby的消息,工作需要这门语言,需要从0开始学习这门语言,慢慢学习简直...太神奇了...,原谅我见识浅薄.原来很早就已经出世了,园子中也 ...

  7. Android随笔之——Android ADB详解

    ADB全称Android Debug Bridge, 是android sdk里的一个工具, 用这个工具可以直接操作管理android模拟器或者真实的andriod设备.它主要有以下几个功能: 1.运 ...

  8. linux下遍历目录

    遍历目录的主要思想 由于目录就是一颗树,所以遍历目录就转换为遍历一棵树.谈到树的遍历就再熟悉不过了,有树的前序.层次和后序遍历,我使用的是前序遍历,后序遍历和前序遍历本质上一样,而层次遍历要比前两个麻 ...

  9. 安装ClouderaManager以及使用ClouderaManager安装分布式集群的若干细节

    目录 前言 整体介绍 分步安装介绍 总结 一.前言        周末干了近四十个小时中间只休息了五个小时终于成功安装了ClouderaManager以及分布式集群,其中各种辛酸无以言表,唯有泪两行. ...

  10. iOS homekit使用说明

    本文由CocoaChina翻译组成员iBenjamin_Go和浅夏@旧时光翻译自苹果开发文档:HomeKit Developer Guide,敬请勘误. 本文档内容包括 第一部分:简介 第二部分:启用 ...