1.php与对象

知识点:

a.关于引用赋值

$other = &$my_obj;
//按照引用复制,指向相同对象。

例子:

<?php
$my_obj = 1;
echo $my_obj."<br/>";//1
$other = &$my_obj;
echo $other."<br/>";//
$my_obj = 2;
echo $other;//2
//按照引用复制,指向相同对象。

2.类与对象

知识点

a.类是对象的模板,对象是类实现的实例

变量函数对应类中的属性和方法。

和函数不同的是,方法必须在类体中声明。

$this是伪变量,可以将类指向一个对象实例。

b.一个类实例

<?php
class ShopProduct{
public $title;
public $producerMainName;
public $producerFirstName;
public $price = 0;
function __construct($title,$firstName,$mainName,$price){
$this->title = $title;
$this->producerFirstName = $firstName;
$this->producerMainName = $mainName;
$this->price = $price;
} function getProducer(){
return $this->producerFirstName." ".$this->producerMainName;
}
}
$product1 = new ShopProduct("My pro","Willa","Tom",5.99);
print "author:{$product1->getProducer()}\n";

输出:

author:Willa Tom

一个更复杂的例子

<?php
class CdProduct{
public $playLength;
public $title;
public $producerMainName;
public $producerFirstName;
public $price;
function __construct($title,$firstName,$mainName,$price,$playLength){
$this->title = $title;
$this->producerFirstName = $firstName;
$this->producerMainName = $mainName;
$this->price = $price;
$this->playLength = $playLength;
} function getPlayLength(){
return $this->playLength;
} function getSummaryLine(){
$base = "{$this->title}({$this->producerMainName},";
$base .= "{$this->producerFirstName})";
$base .= ":playing time -{$this->playLength}";
return $base;
} function getProducer(){
return $this->producerFirstName." ".$this->producerMainName;
}
} class BookProduct{
public $numPages;
public $title;
public $producerMainName;
public $producerFirstName;
public $price;
function __construct($title,$firstName,$mainName,$price,$numPages){
$this->title = $title;
$this->producerFirstName = $firstName;
$this->producerMainName = $mainName;
$this->price = $price;
$this->numPages = $numPages;
} function getnumPages(){
return $this->numPages;
} function getSummaryLine(){
$base = "{$this->title}({$this->producerMainName},";
$base .= "{$this->producerFirstName})";
$base .= ":page count -{$this->numPages}";
return $base;
} function getProducer(){
return $this->producerFirstName." ".$this->producerMainName;
}
} class ShopProduct{
public $title;
public $producerMainName;
public $producerFirstName;
public $price = 0;
function __construct($title,$firstName,$mainName,$price){
$this->title = $title;
$this->producerFirstName = $firstName;
$this->producerMainName = $mainName;
$this->price = $price;
}
  
   function getSummaryLine(){
$base = "{$this->title}({$this->producerMainName},";
$base .= "{$this->producerFirstName})";
return $base;
}
function getProducer(){
return $this->producerFirstName." ".$this->producerMainName;
}
}
$product1 = new ShopProduct("My pro","Willa","Tom",5.99);
print "author:{$product1->getProducer()}<br/>"; $product2 = new CdProduct("My pro","Willa","Tom",5.99,1);
print "PlayLength:{$product2->getPlayLength()}<br/>"; $product3 = new BookProduct("My pro","Willa","Tom",5.99,10);
print "numPages:{$product3->getnumPages()}<br/>";

结果:

author:Willa Tom
PlayLength:1
numPages:10

点评:这三个类写在同一个文件下面,说明php支持一个文件包含多个类。只是这样有点不太好,最好单独一个文件,把他们引入进来,然后创建对象,使用。

这三个类还有一个缺点就是,代码重复了,每个类中都有getSummaryLine()方法,和getProducer()方法。这样就冗余了,这个时候怎么办呢?

如果类之间有一定的继承关系,可以用继承这种机制,当然也不要继承很多层次,那样太深了也不好。

适当的继承能够让类更简洁,更利索!

下面是继承的案例:

<?php
class ShopProduct{
public $numPages;
public $playLength;
public $title;
public $producerMainName;
public $producerFirstName;
public $price;
function __construct($title,$firstName,$mainName,$price,$numPages=0,$playLength=0){
$this->title = $title;
$this->producerFirstName = $firstName;
$this->producerMainName = $mainName;
$this->price = $price;
$this->numPages = $numPages;
$this->playLength = $playLength;
} function getProducer(){
return $this->producerFirstName." ".$this->producerMainName;
} function getSummaryLine(){
$base = "$this->title({$this->producerMainName},";
$base .= "{$this->producerFirstName})";
return $base;
}
} class CdProduct extends ShopProduct{
function getPlayLength(){
return $this->playLength;
} function getSummaryLine(){
$base = "{$this->title}({$this->producerMainName},";
$base .= "{$this->producerFirstName})";
$base .= ":playing time {$this->playLength}";
return $base;
}
} class BookProduct extends ShopProduct{
function getnumPages(){
return $this->numPages;
} function getSummaryLine(){
$base = "{$this->title}({$this->producerMainName},";
$base .= "{$this->producerFirstName})";
$base .= ":page count {$this->numPages}";
return $base;
}
} $product1 = new ShopProduct("My pro","Willa","Tom",5.99);
print "SummaryLine:{$product1->getSummaryLine()}<br/>"; $product2 = new CdProduct("My pro","Willa","Tom",5.99,null,5);
print "SummaryLine:{$product2->getSummaryLine()}<br/>"; $product3 = new BookProduct("My pro","Willa","Tom",5.99,10,null);
print "SummaryLine:{$product3->getSummaryLine()}<br/>";

结果:

SummaryLine:My pro(Tom,Willa)
SummaryLine:My pro(Tom,Willa):playing time 5
SummaryLine:My pro(Tom,Willa):page count 10

点评:子类继承父类的属性和构造行数,以及一些基本的函数。

继承之后,可以覆盖父类的函数,也可以新建自己的函数。继承可以避免类内容的重复,代码的重复。

继续改造,子类中也有自己的构造方法。
在子类中定义构造方法时,需要传递参数给父类的构造方法,否则你得到的可能是一个构造不完整的对象。

<?php
class ShopProduct{
public $title;
public $producerMainName;
public $producerFirstName;
public $price;
function __construct($title,$firstName,$mainName,$price){
$this->title = $title;
$this->producerFirstName = $firstName;
$this->producerMainName = $mainName;
$this->price = $price;
} function getProducer(){
return $this->producerFirstName." ".$this->producerMainName;
} function getSummaryLine(){
$base = "$this->title({$this->producerMainName},";
$base .= "{$this->producerFirstName})";
return $base;
}
} class CdProduct extends ShopProduct{
public $playLength;
function __construct($title,$firstName,$mainName,$price,$playLength){
parent::__construct($title,$firstName,$mainName,$price);//继承父类的构造函数
$this->playLength = $playLength;
} function getPlayLength(){
return $this->playLength;
} function getSummaryLine(){
$base = "{$this->title}({$this->producerMainName},";
$base .= "{$this->producerFirstName})";
$base .= ":playing time {$this->playLength}";
return $base;
}
} class BookProduct extends ShopProduct{
public $numPages;
function __construct($title,$firstName,$mainName,$price,$numPages){
parent::__construct($title,$firstName,$mainName,$price);
$this->numPages = $numPages;
}
function getnumPages(){
return $this->numPages;
} function getSummaryLine(){
$base = "{$this->title}({$this->producerMainName},";
$base .= "{$this->producerFirstName})";
$base .= ":page count {$this->numPages}";
return $base;
}
} $product1 = new ShopProduct("My pro","Willa","Tom",5.99);
print "SummaryLine:{$product1->getSummaryLine()}<br/>"; $product2 = new CdProduct("My pro","Willa","Tom",5.99,5);
print "SummaryLine:{$product2->getSummaryLine()}<br/>"; $product3 = new BookProduct("My pro","Willa","Tom",5.99,10);
print "SummaryLine:{$product3->getSummaryLine()}<br/>";

结果同上一个效果一点,这里面每个子类都有自己的构造方法了,同时继承了父类中的构造方法。这样就保证了子类的灵活性。不完全受制于父类。

进一步添加访问权限设置,

<?php
class ShopProduct{
private $title;
private $producerMainName;
private $producerFirstName;
protected $price;
private $discount = 0;
function __construct($title,$firstName,$mainName,$price){
$this->title = $title;
$this->producerFirstName = $firstName;
$this->producerMainName = $mainName;
$this->price = $price;
} public function getProducerFirstName(){
return $this->producerFirstName;
} public function getProducerMainName(){
return $this->producerMainName;
} public function setDiscount($num){
$this->discount = $num;
} public function getDiscount(){
return $this->discount;
} public function getTitle(){
return $this->title;
} public function getPrice(){
return ($this->price - $this->discount);
} function getProducer(){
return $this->producerFirstName." ".$this->producerMainName;
} function getSummaryLine(){
$base = "$this->title({$this->producerMainName},";
$base .= "{$this->producerFirstName})";
return $base;
}
} class CdProduct extends ShopProduct{
private $playLength;
function __construct($title,$firstName,$mainName,$price,$playLength){
parent::__construct($title,$firstName,$mainName,$price);//继承父类的构造函数
$this->playLength = $playLength;
} function getPlayLength(){
return $this->playLength;
} function getSummaryLine(){
$base = parent::getSummaryLine();
$base .= ":playing time {$this->playLength}";
return $base;
}
} class BookProduct extends ShopProduct{
private $numPages = 0;
function __construct($title,$firstName,$mainName,$price,$numPages){
parent::__construct($title,$firstName,$mainName,$price);
$this->numPages = $numPages;
}
function getnumPages(){
return $this->numPages;
} function getSummaryLine(){
$base = parent::getSummaryLine();
$base .= ":page count {$this->numPages}";
return $base;
}
} $product1 = new ShopProduct("My pro","Willa","Tom",5.99);
print "SummaryLine:{$product1->getSummaryLine()}<br/>"; $product2 = new CdProduct("My pro","Willa","Tom",5.99,5);
print "SummaryLine:{$product2->getSummaryLine()}<br/>"; $product3 = new BookProduct("My pro","Willa","Tom",5.99,10);
print "SummaryLine:{$product3->getSummaryLine()}<br/>";

点评:一般属性设置为私有的,只能通过方法来设置和获取,这样能保证安全性。

《PHP对象、模式与实践》之对象的更多相关文章

  1. Python 源码剖析(一)【python对象】

    处于研究python内存释放问题,在阅读部分python源码,顺便记录下所得.(基于<python源码剖析>(v2.4.1)与 python源码(v2.7.6)) 先列下总结:      ...

  2. Python源码剖析——01内建对象

    <Python源码剖析>笔记 第一章:对象初识 对象是Python中的核心概念,面向对象中的"类"和"对象"在Python中的概念都为对象,具体分为 ...

  3. python源码剖析学习记录-01

    学习<Python源码剖析-深度探索动态语言核心技术>教程         Python总体架构,运行流程   File Group: 1.Core Modules 内部模块,例如:imp ...

  4. Python源码剖析|百度网盘免费下载|Python新手入门|Python新手学习资料

    百度网盘免费下载:Python源码剖析|新手免费领取下载 提取码:g78z 目录  · · · · · · 第0章 Python源码剖析——编译Python0.1 Python总体架构0.2 Pyth ...

  5. Python源码剖析——02虚拟机

    <Python源码剖析>笔记 第七章:编译结果 1.大概过程 运行一个Python程序会经历以下几个步骤: 由解释器对源文件(.py)进行编译,得到字节码(.pyc文件) 然后由虚拟机按照 ...

  6. Python 源码剖析 目录

    Python 源码剖析 作者: 陈儒 阅读者:春生 版本:python2.5 版本 本博客园的博客记录我会适当改成Python3版本 阅读 Python 源码剖析 对读者知识储备 1.C语言基础知识, ...

  7. Python 源码剖析(六)【内存管理机制】

    六.内存管理机制 1.内存管理架构 2.小块空间的内存池 3.循环引用的垃圾收集 4.python中的垃圾收集 1.内存管理架构 Python内存管理机制有两套实现,由编译符号PYMALLOC_DEB ...

  8. 【Python源码剖析】对象模型概述

    Python 是一门 面向对象 语言,实现了一个完整的面向对象体系,简洁而优雅. 与其他面向对象编程语言相比, Python 有自己独特的一面. 这让很多开发人员在学习 Python 时,多少有些无所 ...

  9. [Python源码剖析]字符缓冲池intern机制

    static PyStringObject *characters[UCHAR_MAX + 1]; ... /* This dictionary holds all interned strings. ...

  10. [Python源码剖析]获取Python小整数集合范围

    #!/usr/bin/env python #-*- coding=utf-8 -*- small_ints = dict() for i in range(-10000,10000): small_ ...

随机推荐

  1. 存一些可能会用得到的vue的UI框架

    VUX 项目主页:https://vux.li/#/ github地址:https://github.com/airyland/vux element UI(饿了么后台) Element 是由饿了么U ...

  2. php 代替 js实现自定义时间选择器

    w 0-php来结合服务端数据,处理前端页面的交互: 1-php 加法 乘法的效率对比,对算术运算的优化. 减少乘法运算? function w_select($wname, $wii) { $w = ...

  3. atob, slice,bin2hex,escape

    JS处理二进制数据 http://phpor.net/blog/post/1898

  4. Java 集合框架之 JDK 1.5 新特性

    forEach 循环 多用于元素迭代. 适用范围: - 数组 - 实现 Iterable 接口的集合类 格式: for(类型 变量 : Collection 集合 | 数组) { } 传统 for 和 ...

  5. scrapy spider

    spider 定义:在spiders文件夹中由用户自定义,继承scrapy.Spider类或其子类 Spider并没有提供什么特殊的功能. 其仅仅请求给定的 start_urls/start_requ ...

  6. (4.1)SQL Server Browser 与动态端口

    转自:http://blog.51cto.com/jimshu/1120295 一.启用TCP端口 1.启用TCP/IP协议 打开SSCM(SQL Server Configuration Manag ...

  7. CSDN编程挑战——《进制转换》

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/user_longling/article/details/24804949 进制转换 题目详情: 我 ...

  8. Angular4中常用管道(转载)

    Angular4中常用管道 通常我们需要使用管道实现对数据的格式化,Angular4中的管道和之前有了一些变化,下面说一些常用的管道. 一.大小写转换管道 uppercase将字符串转换为大写 low ...

  9. CoreThink开发(十一)首页控制器判断移动设备还是PC并做相应处理

    在home模块Index控制器添加判断代码 application\Home\Controller\IndexController.class.php <?php // +----------- ...

  10. mysql内置数据库

    1 mysql本地连接数据库 >mysql -h localhost -u root -proot    注意-p后面没有空格,是直接跟上密码 或者 >mysql -h localhost ...