[源码下载]

速战速决 (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. 如何调试ANDROID下面黑屏问题

    最近很多朋友在问,为毛在WINDOWS下对了,跑ANDROID的虚拟机或者真机就黑屏了, 有的是只有FPS信息,有的是连FPS信息都没有.如果是程序能够正常启动,不会闪退,但显示不对. 那十有八九都是 ...

  2. android内部培训视频_第二节 布局基础

    第二节:布局入门 一.线性布局 需要掌握的属性: 1.orientation:排列方式 vertical:垂直 Horizontal:水平 2.weight:水平布局的权重 3.gravity:子控件 ...

  3. php后台修改人员表信息

    显示info人员表里所有内容 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "h ...

  4. Atitit View事件分发机制

    1. Atitit View事件分发机制 1. Atitit View事件分发机制1 1.1. 三个关键方法 dispatchTouchEvent onInterceptTouchEvent onTo ...

  5. 不care小米,梁军坦言微鲸才是乐视最大对手

    除了每天毫无悬念地上头条和陷入困境的生态帝国之外,乐视还要继续操心着它的对手们."挑事儿"的小米已经不足为惧,后起之秀微鲸成了一个令它"头疼"的所在.因为,不仅 ...

  6. dede在php7上空白

    最近想看一本小说,想采集回来看,结果发现除了dedecms支持php7.0,其他主流cms基本上都不支持php7.0 在本地win7上调试了一遍,没有问题,放到linux服务器上的时候,发现打开任何页 ...

  7. Unknown lifecycle phase "mvn". You must specify a valid lifecycle phase or a goal in the format <plugin-prefix>:<goal> or <plugin-group-id>:<plugin-artifact-id>[:<plugin-version>]:<goal>

    在用maven命令启动storm时候,命令行是:mvn exec:java -Dexec.mainClass="TopologyMain" -Dexec.args="sr ...

  8. android 手把手教您自定义ViewGroup(一)

    1.概述 在写代码之前,我必须得问几个问题: 1.ViewGroup的职责是啥? ViewGroup相当于一个放置View的容器,并且我们在写布局xml的时候,会告诉容器(凡是以layout为开头的属 ...

  9. 没有Hyper-V服务,WP Emulator无法启动

    解决: 打开管理工具

  10. FontAwesome 4.4.0 中完整的585个图标样式CSS参考

    做一记录,免得每次都去网上搜图标对应的class. 在线版本:http://dnt.dkill.net/dnt/font/