速战速决 (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(第一个支持动态类型的语言,支持 ...
随机推荐
- iOS开发系列--并行开发其实很容易
--多线程开发 概览 大家都知道,在开发过程中应该尽可能减少用户等待时间,让程序尽可能快的完成运算.可是无论是哪种语言开发的程序最终往往转换成汇编语言进而解释成机器码来执行.但是机器码是按顺序执行的, ...
- (源码下载)高灵活度,高适用性,高性能,轻量级的 ORM 实现
我在上一篇博客中简单说明了一个面向内存数据集的“ORM”的实现方法,也提到我的设计实现或许不能称之为“ORM”,姑且称之为 S-ORM吧. 可能有些小伙伴没有理解我的思路和目的,与传统ORM框架做了简 ...
- SecureCRT使用技巧
原创文章转载请注明出处:@协思, http://zeeman.cnblogs.com 修改SecureCRT颜色配置 option->Global options –> Termina ...
- 如何调试ANDROID下面黑屏问题
最近很多朋友在问,为毛在WINDOWS下对了,跑ANDROID的虚拟机或者真机就黑屏了, 有的是只有FPS信息,有的是连FPS信息都没有.如果是程序能够正常启动,不会闪退,但显示不对. 那十有八九都是 ...
- TODO:Linux安装PHP MongoDB驱动
TODO:Linux安装PHP MongoDB驱动 PHP利于学习,使用广泛,主要适用于Web开发领域. MongoDB的主要目标是在键/值存储方式(提供了高性能和高度伸缩性)以及传统的RDBMS系统 ...
- 机器学习理论知识部分--偏差方差平衡(bias-variance tradeoff)
摘要: 1.常见问题 1.1 什么是偏差与方差? 1.2 为什么会产生过拟合,有哪些方法可以预防或克服过拟合? 2.模型选择例子 3.特征选择例子 4.特征工程与数据预处理例子 内容: 1.常见问题 ...
- meta标签中的http-equiv属性使用介绍(转载)
meta是html语言head区的一个辅助性标签.也许你认为这些代码可有可无.其实如果你能够用好meta标签,会给你带来意想不到的效果,meta标签的作用有:搜索引擎优化(SEO),定义页面使用语言, ...
- 自定义配置UEditor 工具栏上的按钮列表
修改配置项的方法: 1. 方法一:修改 ueditor.config.js 里面的 toolbars 2. 方法二:实例化编辑器的时候传入 toolbars 参数 方法一:在ueditor.confi ...
- MySql事务概述
事务是访问并更新数据库中各种数据项的一个程序执行单元.在事务中的操作,要么都执行修改,要么都不执行,这就是事务的目的,也是事务模型区别于文件系统的重要特征之一. 严格上来说,事务必须同时满足4个特性, ...
- .Net 转战 Android 4.4 日常笔记(10)--ADT集成环境更新SDK
今天下载了一份原来来参考,却发现SDK版本偏低我没有安装 用SDK Manager却一直更新不了出现 Failed to fetch URL https://dl-ssl.google.com/and ...