速战速决 (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的更多相关文章
- Java基础教程——接口
接口 接口只是一种约定.--Anders 接口定义了一种规范--多个类共同的公共行为规范. 对于接口的实现者--规定了必须向外提供哪些服务 对于接口的调用者--规定了可以调用哪些服务,如何调用这些服务 ...
- Java基础学习笔记十二 类、抽象类、接口作为方法参数和返回值以及常用API
不同修饰符使用细节 常用来修饰类.方法.变量的修饰符 public 权限修饰符,公共访问, 类,方法,成员变量 protected 权限修饰符,受保护访问, 方法,成员变量 默认什么也不写 也是一种权 ...
- python开发面向对象基础:接口类&抽象类&多态&钻石继承
一,接口类 继承有两种用途: 一:继承基类的方法,并且做出自己的改变或者扩展(代码重用) 二:声明某个子类兼容于某基类,定义一个接口类Interface,接口类中定义了一些接口名(就是函数名)且并未实 ...
- python基础 抽象类(接口类)
Python中没有接口.接口类,抽象类:定义 制定一个规范 #必须要导入from abc import ABCMeta,abstractmethod class Payment(metaclass = ...
- Java基础——抽象类和接口
之所以将抽象类和接口放在一起做笔记,是因为他们之间很难区分又各自独立.在学习完Java程序设计的三大特点(封装.继承.多态)之后,我最大的收获是,慢慢理解了Java语言这种面向对象程序设计的优越性,它 ...
- day 25-1 接口类、抽象类、多态
# 接口类:python 原生不支持# 抽象类:python 原生支持的 接口类 首先我们来看一个支付接口的简单例子 from abc import abstractmethod,ABCMeta #我 ...
- Python——接口类、抽象类
建立一个接口类.抽象类的规范 from abc import abstractmethod,ABCMeta class Payment(metaclass=ABCMeta): # 元类 默认的元类 t ...
- day25:接口类和抽象类
1,接口类和抽象类知识背景:一开始在程序界是没有这些概念的,后来就流行了一种语言叫做JAVA,JAVA是一种典型的纯面向对象的语言,JAVA写的程序都是非常适用于更庞大的项目,很多程序员就总结出了一些 ...
- java普通类、抽象类、接口、面向对象理解
1.面向对象编程: 面向对象编程的语言不止java一种,还有: simula 67(第一个面向对象语言,支持单继承和一定含义的多态和部分动态绑定): Smalltalk(第一个支持动态类型的语言,支持 ...
随机推荐
- CSharpGL(4)设计和使用Camera
CSharpGL(4)设计和使用Camera +BIT祝威+悄悄在此留下版了个权的信息说: 主要内容 描述在OpenGL中Camera的概念和用处. 设计一个Camera以及操控Camera的Sate ...
- [ASP.NET MVC 小牛之路]10 - Controller 和 Action (2)
继上一篇文章之后,本文将介绍 Controller 和 Action 的一些较高级特性,包括 Controller Factory.Action Invoker 和异步 Controller 等内容. ...
- 用css画出三角形
看到有面试题里会有问到如何用css画出三角形 众所周知好多图形都可以拆分成三角形,所以说会了画三角形就可以画出很多有意思的形状 画出三角形的原理是调整border(边框)的四个方向的宽度,线条样式以及 ...
- vue.js组件化开发实践
前言 公司目前制作一个H5活动,特别是有一定统一结构的活动,都要码一个重复的轮子.后来接到一个基于模板的活动设计系统的需求,便有了下面的内容.借油开车. 组件化 需求一到,接就是怎么实现,技术选型自然 ...
- selenium的安装
一.安装selenium 通过pip命令安装selenium包:(pip的安装方法:http://www.cnblogs.com/zhengyihan1216/articles/6011640.htm ...
- android studio sdk 不能更新
网上看到好多sdk不能更新的,解决办法基本上一下,试了下大都没用,,有人说改hosts ,我试了 貌似没用 下面是我亲测可以更新的一种方法:使用镜像地址更新 步骤: 1. 打开 SDK Manager ...
- EF-DbUpdateException--实体类和数据库列不对应的解决方案
错误信息 1.VS实体类里面的字段 2数据库里面的字段 猜测是因为字段数不匹配导致的 3删除多余字段 5.结果 错误信息贴上: -------------------------Log_Header- ...
- 收集的React.JS资料
主页 http://facebook.github.io/react/ https://github.com/facebook/react 中文站 http://www.reactjs.cn/ h ...
- Win10系统菜单打不开问题的解决,难道是Win10的一个Bug ?
Win10左下角菜单打不开,好痛苦,点击右下角的时间也没反应,各种不爽,折磨了我好几天,重装又不忍心,实在费劲,一堆开发环境要安装,上网找了很多方法都不适用.今天偶然解决了,仔细想了下,难道是Win1 ...
- ASP.NET MVC之文件上传【二】(九)
前言 上一节我们讲了简单的上传以及需要注意的地方,查相关资料时,感觉上传里面涉及到的内容还是比较多,于是就将上传这一块分为几节来处理,同时后续也会讲到关于做上传时遗漏的C#应该注意的地方,及时进行查漏 ...