php的类使用样例
这个demo。差不多php的类的主要知识点都用到了。
public,private关键字,
namespace,use命令空间,
require导入,
interface复用,
abstract抽象类,
trait代码复用
static静态变量及静态方法
extends继承
implements实现
__construct初始化
=====================
Unique.php
<?php namespace Bookstore\Utils; trait Unique { //static静态属性,类似于其它语言的类变量 private static $lastId = 0; //protected保护属性,仅允许继承类访问 protected $id; public function setId(int $id) { //内置函数判断id是否为空,比$id == null要逼格好点 if (empty($id)) { //注意区分$this-和self::$的语法 $this->id = ++self::$lastId; } else { $this->id = $id; if ($id > self::$lastId) { self::$lastId = $id; } } } public function getId():int { return $this->id; } //静态方法 public static function getLastId():int { return self::$lastId; } } ?>
Person.php
<?php namespace Bookstore\Domain; use Bookstore\Utils\Unique; //命名空间可以直接use,但如果这个命名空间没有在标准约定位置,且没有自动载入的话,需要使用require来手工定位一下. require_once __DIR__ . '/Unique.php'; class Person { //trait的用法,类内use use Unique; //protected保护属性,仅允许继承类访问 protected $firstname; protected $surname; //private私有属性,不允许类外部直接修改 private $email; //构造函数,初始化类的好地方 public function __construct( $id, string $firstname, string $surname, string $email ) { $this->firstname = $firstname; $this->surname = $surname; $this->email = $email; //复用trait内的方法代码 $this->setId($id); } public function getFirstname():string { return $this->firstname; } public function getSurname():string { return $this->surname; } public function getEmail():string { return $this->email; } //类的部通过public方法更改属性,达到信息封装;类内部通过->修改. public function setEmail(string $email) { $this->email = $email; } } ?>
Payer.php
<?php //命名空间 namespace Bookstore\Domain; interface Payer { public function pay(float $amount); public function isExtentOfTaxes(): bool; } ?>
Customer.php
<?php //命名空间 namespace Bookstore\Domain; //use Bookstore\Domain\Payer; require_once __DIR__ . '/Payer.php'; interface Customer { public function getMonthlyFee(): float; public function getAmountToBorrow(): int; public function getType(): string; } ?>
Basic.php
<?php namespace Bookstore\Domain; /* use Bookstore\Domain\Person; use Bookstore\Domain\Customer; use Bookstore\Domain\Payer; */ require_once __DIR__ . '/Person.php'; require_once __DIR__ . '/Customer.php'; require_once __DIR__ . '/Payer.php'; class Basic extends Person implements Customer, Payer { public function getMonthlyFee():float { return 5.0; } public function getAmountToBorrow():int { return 3; } public function getType(): string { return 'Basic'; } public function pay(float $amount) { echo "Paying $amount."; } public function isExtentOfTaxes(): bool { return false; } } ?>
Premium.php
<?php namespace Bookstore\Domain; /* use Bookstore\Domain\Person; use Bookstore\Domain\Customer; use Bookstore\Domain\Payer; */ require_once __DIR__ . '/Person.php'; require_once __DIR__ . '/Customer.php'; require_once __DIR__ . '/Payer.php'; class Premium extends Person implements Customer, Payer { public function getMonthlyFee():float { return 10.0; } public function getAmountToBorrow():int { return 10; } public function getType(): string { return 'Premium'; } public function pay(float $amount) { echo "Paying $amount."; } public function isExtentOfTaxes(): bool { return true; } } ?>
Book.php
<?php namespace Bookstor\Domain; class Book { public function __construct ( int $isbn, string $title, string $author, int $available = 0 ) { $this->isbn = $isbn; $this->title = $title; $this->author = $author; $this->available = $available; } public function getIsbn():int { return $this->isbn; } public function getTitle():string { return $this->title; } public function getAuthor():string { return $this->author; } public function isAvailable():bool { return $this->available; } public function getCopy():bool { if ($this->available < 1) { return false; } else { $this->available--; return true; } } public function addCopy() { $this->available++; } public function __toString() { $result = '<i>' . $this->title . '</i> - ' . $this->author; if (!$this->available) { $result .= ' <b>Not available</b>'; } else { $result .= " <b>{$this->available}</b>"; } return $result . '<br/>'; } } ?>
test.php
<?php //使用命名空间,易于在大型应用中管理和组织php类. use Bookstor\Domain\Book; use Bookstore\Domain\Customer; use Bookstore\Domain\Person; use Bookstore\Domain\Basic; use Bookstore\Domain\Premium; use Bookstore\Utils\Unique; //命名空间可以直接use,但如果这个命名空间没有在标准约定位置,且没有自动载入的话,需要使用require来手工定位一下. require_once __DIR__ . '/Unique.php'; require_once __DIR__ . '/Book.php'; require_once __DIR__ . '/Customer.php'; require_once __DIR__ . '/Person.php'; require_once __DIR__ . '/Basic.php'; require_once __DIR__ . '/Premium.php'; $book1 = new Book("1984", "George Orwell", 9785267006323, 12); $book2 = new Book("1984", "George Orwell", 9785267006323); $customer1 = new Basic(5, 'John', 'Doe', 'johndoe@mail.com'); //$customer2 = new Customer(null, 'Mary', 'Poppins', 'mp@mail.com'); $customer3 = new Premium(7, 'James', 'Bond', '007@mail.com'); if ($book1->getCopy()) { echo 'Sale 1 copy.<br/>'; } else { echo 'can not sale.<br/>'; } //数据类型转换,天下语言几乎大同. $string1 = (string)$book1; $string2 = (string)$book2; echo $string1; echo $string2; //调用类的静态方法,可以直接用类名,也可以用实例名.但都是用::符号. echo Person::getLastId(); echo '<br/>'; echo $customer1::getLastId(); function checkIfValid(Customer $customer, array $books):bool { return $customer->getAmountToBorrow() >= count($books); } echo '<br/>'; var_dump(checkIfValid($customer1, [$book1])); echo '<br/>'; var_dump(checkIfValid($customer3, [$book1])); echo '<br/>'; $basic = new Basic(1, "name", "surname", "email"); $premium = new Premium(2, "name", "surname", "email"); var_dump($basic->getId()); echo '<br/>'; var_dump($premium->getId()); echo '<br/>'; var_dump(Person::getLastId()); echo '<br/>'; var_dump(Unique::getLastId()); echo '<br/>'; var_dump(Basic::getLastId()); echo '<br/>'; var_dump(Premium::getLastId()); echo '<br/>'; //判断父类及继承关系 var_dump($basic instanceof Basic); echo '<br/>'; var_dump($premium instanceof Basic); echo '<br/>'; var_dump($basic instanceof Customer); echo '<br/>'; var_dump($premium instanceof Payer); echo '<br/>'; var_dump($basic instanceof Payer); echo '<br/>'; function processPayment($payer, float $amount) { if ($payer->isExtentOfTaxes()) { echo "What a lucky one..."; } else { $amount *= 1.16; } $payer->pay($amount); } //多态实现 processPayment($basic, 2000); echo '<br/>'; processPayment($premium, 2000); echo '<br/>'; ?>
输出:
Sale 1 copy. George Orwell - 9785267006323 11 George Orwell - 9785267006323 Not available 7 7 bool(true) bool(true) int(1) int(2) int(7) int(0) int(7) int(7) bool(true) bool(false) bool(true) bool(false) bool(false) Paying 2320. What a lucky one...Paying 2000.
php的类使用样例的更多相关文章
- Scala模式匹配和样例类
Scala有一个十分强大的模式匹配机制,可以应用到很多场合:如switch语句.类型检查等.并且Scala还提供了样例类,对模式匹配进行了优化,可以快速进行匹配. 1.字符匹配 def mai ...
- OpenCV LDA(Linnear Discriminant analysis)类的使用---OpenCV LDA演示样例
1.OpenCV中LDA类的声明 //contrib.hpp class CV_EXPORTS LDA { public: // Initializes a LDA with num_componen ...
- 【Scala篇】--Scala中Trait、模式匹配、样例类、Actor模型
一.前述 Scala Trait(特征) 相当于 Java 的接口,实际上它比接口还功能强大. 模式匹配机制相当于java中的switch-case. 使用了case关键字的类定义就是样例类(case ...
- Scala--模式匹配和样例类
模式匹配应用场景:switch语句,类型查询,析构,样例类 一.更好的switch val ch :Char = '+' val sign = ch match{ case '+' => 1 c ...
- Scala-Unit6-final/type关键字、样例类&样例对象
一.关键字 1.final关键字 用final修饰的类:不能被继承 用final修饰的方法:不能被重写 注意:(1)在Scala中变量不需要用final修饰,因为val与var已经限制了变量是否可变 ...
- Scala基础:模式匹配和样例类
模式匹配 package com.zy.scala import scala.util.Random /** * 模式匹配 */ object CaseDemo { def main(args: Ar ...
- Java线程演示样例 - 继承Thread类和实现Runnable接口
进程(Process)和线程(Thread)是程序执行的两个基本单元. Java并发编程很多其它的是和线程相关. 进程 进程是一个独立的执行单元,可将其视为一个程序或应用.然而,一个程序内部同事还包括 ...
- Scala学习十四——模式匹配和样例类
一.本章要点 match表达式是更好的switch,不会有意外调入下一个分支 如果没有模式能够匹配,会抛出MatchError,可以用case _模式避免 模式可以包含一个随意定义的条件,称做守卫 你 ...
- 学好Spark/Kafka必须要掌握的Scala技术点(二)类、单例/伴生对象、继承和trait,模式匹配、样例类(case class)
3. 类.对象.继承和trait 3.1 类 3.1.1 类的定义 Scala中,可以在类中定义类.以在函数中定义函数.可以在类中定义object:可以在函数中定义类,类成员的缺省访问级别是:publ ...
随机推荐
- 【技术博客】Django中文件下载的实现
开发组在开发过程中,都不可避免地遇到了一些困难或问题,但都最终想出办法克服了.我们认为这样的经验是有必要记录下来的,因此就有了[技术博客]. Django中文件下载的实现 1.背景 在VisualPy ...
- 安装OpenIMSCore的SIP测试客户端 utcimsclient
环境 Ubuntu16.04,Vmvare12(win10). 下载 & 解压 //utcimsclient 下载地址 : https://liquidtelecom.dl.sourcefor ...
- Qt应用程序主窗口之二:拖放操作与打印文档
一.拖放操作 对于一个实用的应用程序,不仅希望能从文件菜单中打开一个文件,更希望可以通过拖动直接将桌面上的文件拖入程序界面上来打开,就像可以将.pro文件拖入Creator中来打开整个项目一样.Qt中 ...
- ORM之模型对象Model
模型对象Model Odoo的模型对象在odoo模块的models.py文件中,最基础的对象是BaseModel; Odoo的模型对象有三个:AbstractModel.Model.Transient ...
- storm单节点问题(转载)
一.storm nimbus 单节点问题概述 1.storm集群在生产环境部署之后,通常会是如下的结构: 从图中可以看出zookeeper和supervisor都是多节点,任意1个zookeeper节 ...
- 『7.5 NOIP模拟赛题解』
T1 Gift Description 人生赢家老王在网上认识了一个妹纸,然后妹纸的生日到了,为了表示自己的心 意,他决定送她礼物.可是她喜爱的东西特别多,然而他的钱数有限,因此他想 知道当他花一 ...
- 阿里 P8 高级架构师吐血总结的 《Java 核心知识整理&面试.pdf》| 免费分享
最近在网上发现一份非常棒的 PDF 资料,据说是阿里 P8 级高级架构师吐血总结的, 其中内容覆盖很广,包括 Java 核心基础.Java 多线程.高并发.Spring.微服务.Netty 与 RPC ...
- Kafka跨集群迁移方案MirrorMaker原理、使用以及性能调优实践
序言Kakfa MirrorMaker是Kafka 官方提供的跨数据中心的流数据同步方案.其实现原理,其实就是通过从Source Cluster消费消息然后将消息生产到Target Cluster,即 ...
- 同级frame之间的通信与跳转
项目最近需求两个同级的frame,通过点击一个frame里面的btn按钮来实现另一个frame的跳转(注意这俩个frame在同一个frameset下面): 原理:通过该frame找到父frameset ...
- 《C++ Primer》学习总结;兼论如何使用'书'这种帮助性资料
6.25~ 6.27,用了3天翻了一遍<C++ Primer>. ▶书的 固有坏处 一句话: 代码比 文字描述 好看多了.————> 直接看习题部分/ 看demo就行了 看文字在描述 ...