PHP面向对象教程之自定义类


Posted in PHP onJune 10, 2014

那怎么开始设计一个合格的类呢,一开始就写class{}的都错了,正确的是什么都不写,而是假设这个类已经存在,这个对象已经存在,各种属性方法都已经有了,在这个完全的假设下想象下这个对象应该怎么用,例如我们制作一个缩略图的类,我们希望封装成一个类,方便下次使用,我们首先需要明确对象是什么它会做什么,要制作缩略图本质操作是缩小图片并输出,这里被操作的是图片,那么对象就是图片,由于网站上的图片不是唯一的我们得告诉这是那张图片,这就可以假设下这个类已经存在,一开始就得声明是那张图片,例如$simg = new simg("1.jpg");那么,一张图片应该有哪些属性? 在制作缩略图的时候,我们最关心的应该是 宽,高,类型,而且这三项对一张图片而言是肯定的,这意味着这个对象一定有这些属性,$simg->width,$simg->height,$simg->type,并且这些属性一开始就可以读取的到的,

1 $simg = new simg("1.jpg");
2 echo $simg->width;
3 echo $simg->height;
4 echo $simg->type;
5 //这个对象,应该可以这样操作。

根据oop的思想的原则,如果对象的属性被改变,对象应当也会发生相应的改变,这就意味着我们可以给它赋值,取得对象的宽度,高度,计算后(比如按比例缩小),重新赋值回去。我们本质是要制作一张图片的缩略图,也就是生成一张新的图片,改变它之后,接下来要做的事情就应该是把这个改变过的图片存起来了,存起来是一个过程,所以它会是一个方法。 例如 $simg->save(),考虑到要换一个地方存。至少要改一个名字吧, 也就是说在使用的时候,这个对象应该是这样描述的,图片 保存到 …… 这意味着,这个方法,有一个参数,就是保存到哪。

$simg = new simg("1.jpg");//实例化
$simg->width = 200;//设置宽度
$simg->height = 200;//设置高度
$simg->save("2.jpg");//保存到2.jpg

在使用这个类的时候思维描述和写出来的代码应当完全一致,这里的思维描述出现了一个小问题,可能会产生不符合oop思维原则的误导,这里不符合面向对象的是:对象属性重新赋值 原图的大小为什么没有发生变化,变化的是另存出来的,也就是说这个对象其实是php内存中源对象的复制品,我们改变了复制品的大小并保存了下来,所以图片被真正改变之前图片的属性应当是只读的,改写是无效的, 所以,如果以原图做为对象来描述的话。这样描述应该更准确:图片 改变大小后 另存为 。而原图的大小是没有发生改变的,改变大小是一个过程,这意味着这也是一个方法,

//这个类,用起来应该是这样的。
//实例化一张图片
$simg = new simg("1.jpg");
//读取图片宽高计算比例
$simg->width 
$simg->height
//图片使用指定的宽高另存为……
$simg->size(200,200)->save("2.jpg");

 

这是以原图做为对象的角度来描述的,尽管是不存在的一个类,但它的用法必须事先存在,并且符合oop的思想原则,即这是个什么东西,它可以做些什么。如果从另外的角度来思考呢,以即将被输出的图片作为对象呢,那么这个对象创建出来的时候它应该是空的,然后它必须以某张原图为基准,然后调整它的大小,再把它保存下来,

//按这个思路描述。代码应该是这个样子
$simg = new simg();  //一开始是空的
echo $simg->width;   //肯定是 0
$simg->load("1.jpg"); //以一张图为基准
echo $simg->width;    //没改过,是原图大小
//改变大小
$simg->width = 200;
$simg->height = 200; 
$simg->save("2.jpg");  //保存起来

此时看起来还不太明显

下面会更好:

$simg = new simg("2.jpg");  //一开始是空的,指定一个文件名
$simg->load("1.jpg"); //以一张图为基准
//改变大小
$simg->width = 200;
$simg->height = 200; 
$simg->save();  //保存起来

这样会更明显一些,实例化一个缩略图,但它还不存在,直到保存以后它才存在于硬盘中 。

在此我们先按照第一种方式以原图为对象的角度创建这个类,根据上面的分析如下:

<?PHP
class simg {
    public $width = 0;
    public $height = 0;
    public function __construct($img) {
    }
    public function size($width, $height) {
    }
    public function save($path) {
    }
}

之后再根据对每个方法每个属性的要求,填上里面的代码,一开始就必须知道文件的高度,宽度,由于php处理不同类型的图片使用的函数不同,我们在这里不得不知道文件类型是多少。以决定用哪个函数 设计类的时候,才是思考“怎么做”的时候,要在实例化之后,马上知道宽高。一定是在构造函数里完成的,只有构造函数会在类实例化的时候执行,这里我们可以使用 getimagesize 函数,取得文件的宽度,高度,类型 ,宽度和高度,我们可以在这里,赋值给属性。这样一来,实例化图片,就得到属性的问题就解决了,那改变大小的过程呢?

<?PHP
class simg {
    public $width = 0;
    public $height = 0;
    public function __construct($img) {
        $var = getimagesize($img);
        $this->width = $var[0];
        $this->height = $var[1];
    }
    public function size($width, $height) {
    }
    public function save($path) {
    }
}

由于网络上常用的图片类型有gif jpg png 三种,其他的类型暂时不做考虑,调整大小的方法。在输出之前是什么也不做的。可以说,我们的代码,只要知道要输出的图片是多大就可以了 但是,不同的方法,内部变量不通用。怎么办注册全局变量容易被外部变量干扰和污染,那我们就利用类的属性来保存。新加两个属性这里暂定为w和h,这两个属性,严格来说不是属性,只是我们利用属性来在方法之间传递变量而已,为了避免它们在类的外部被访问和修改我们在定义的时候使用关键字私有来进行访问限制,private $w = 0;private  $h = 0;

  public function size($width, $height) {
        $this->w = $width;
        $this->h = $height;
    }

改变大小的方法,只要暂时把要输出的宽度和高度记下来就可以了。 下面就是保存了,要保存之前,得先把图片弄小了才行,所以,缩略图的计算过程,主要在这里完成,需要载入原图才能缩小,而且,也要知道文件类型才行 ,因为不同类型的图片载入方式是不同的,文件名和文件类型。在构造函数才知道,此时我们再加入两个公共属性,

 public $width = 0;
    public $height = 0;
    public $path = '';
    public $type = 0;
    private  $w = 0;
    private  $h = 0;
    public function __construct($img) {
        $var = getimagesize($img);
        $this->width  = $var[0];
        $this->height = $var[1];
        $this->path   = $img;
        $this->type   = $var[2];   
    }

 之后,我们可以在保存的方法里,载入原图,改变大小,并保存到指定的位置上,至于保存方法的书写不同的类型调用的函数时不同的可以选择使用switch ($var[2])进行判断 在进行新建一个缩略图然后保存。

//按这个类的编写方式。。使用方法应该是这样
$simg = new simg("1.jpg");
//读取宽高并计算
$simg->width
//设置大小
$simg->size(200, 200);
//保存到
$simg->save("2.jpg");

 和描述有点不一样 ,因为描述是:使用(这个)大小,另存为(这里)这个描述有点绕口,如果可以这样写就没问题了$simg->size(200, 200)->save("2.jpg");对象的使用必须是这样的对象->方法()这就要求前面的量里的值必须是一个对象,save前面是size这就要求size的返回值必须是一个对象,但是这个方法没有什么东西需要返回,而且这个对象肯定是当前对象,才会有save方法,没有对象不要紧我们自己添加一个,

 

public function size($width, $height) {
        $this->w = $width;
        $this->h = $height;
        return $this;
    }

返回当前的对象,这样就可以用图片 使用(这个)大小,另存为(这里)$simg->size(200, 200)->save("2.jpg");这样一个符合oop思想的类封装完成了。

PHP 相关文章推荐
php5 apache 2.2 webservice 创建与配置(java)
Jan 27 PHP
php在程序中将网页生成word文档并提供下载的代码
Oct 09 PHP
基于php和mysql的简单的dao类实现crud操作功能
Jan 27 PHP
yii操作cookie实例简介
Jul 09 PHP
php中switch与ifelse的效率区别及适用情况分析
Feb 12 PHP
thinkPHP中钩子的两种配置调用方法详解
Nov 11 PHP
php异步:在php中使用fsockopen curl实现类似异步处理的功能方法
Dec 10 PHP
PHP实现深度优先搜索算法(DFS,Depth First Search)详解
Sep 16 PHP
PHP ADODB生成HTML表格函数rs2html功能【附错误处理函数用法】
May 29 PHP
php微信扫码支付 php公众号支付
Mar 24 PHP
php学习笔记之字符串常见操作总结
Jul 16 PHP
PhpStorm的使用教程(本地运行PHP+远程开发+快捷键)
Mar 26 PHP
微信营销平台系统?刮刮乐的开发
Jun 10 #PHP
百度地图API应用之获取用户的具体位置
Jun 10 #PHP
php截取字符串函数substr,iconv_substr,mb_substr示例以及优劣分析
Jun 10 #PHP
一个严格的PHP Session会话超时时间设置方法
Jun 10 #PHP
解决CodeIgniter伪静态失效
Jun 09 #PHP
CI(CodeIgniter)框架介绍
Jun 09 #PHP
CI框架中集成CKEditor编辑器的教程
Jun 09 #PHP
You might like
PHP 编程安全性小结
2010/01/08 PHP
超级好用的一个php上传图片类(随机名,缩略图,加水印)
2010/06/30 PHP
PHP 作用域解析运算符(::)
2010/07/27 PHP
PHP获取input输入框中的值去数据库比较显示出来
2016/11/16 PHP
php usort 使用用户自定义的比较函数对二维数组中的值进行排序
2017/05/02 PHP
Yii框架实现的验证码、登录及退出功能示例
2017/05/20 PHP
PHP yield关键字功能与用法分析
2019/01/03 PHP
JS声明变量背后的编译原理剖析
2012/12/28 Javascript
JS中for循序中延迟加载动态效果的具体实现
2013/08/18 Javascript
javascript设计模式之工厂模式示例讲解
2014/03/04 Javascript
HTML5之WebSocket入门3 -通信模型socket.io
2015/08/21 Javascript
温习Javascript基础语法之词法结构
2016/05/31 Javascript
JS 数字转换为大写金额的简单实例
2016/08/04 Javascript
jquery checkbox的相关操作总结
2016/10/17 Javascript
利用D3.js实现最简单的柱状图示例代码
2016/12/09 Javascript
Iscrool下拉刷新功能实现方法(推荐)
2017/06/26 Javascript
webpack打包js的方法
2018/03/12 Javascript
JavaScript交换变量的常用方法小结【4种方法】
2020/05/07 Javascript
jQuery HTML css()方法与css类实例详解
2020/05/20 jQuery
python字符串排序方法
2014/08/29 Python
python 简单搭建阻塞式单进程,多进程,多线程服务的实例
2017/11/01 Python
python如何把嵌套列表转变成普通列表
2018/03/20 Python
python爱心表白 每天都是浪漫七夕!
2018/08/18 Python
编写多线程Python服务器 最适合基础
2018/09/14 Python
PyQt5创建一个新窗口的实例
2019/06/20 Python
pytorch-RNN进行回归曲线预测方式
2020/01/14 Python
python调用win32接口进行截图的示例
2020/11/11 Python
canvas粒子动画背景的实现示例
2018/09/03 HTML / CSS
美国精品家居用品网站:US-Mattress
2016/08/24 全球购物
历史系毕业生自荐信
2013/10/28 职场文书
保证书范文大全
2014/04/28 职场文书
2014年变电站工作总结
2014/12/19 职场文书
学雷锋日活动总结
2015/02/06 职场文书
不服劳动仲裁起诉书
2015/05/20 职场文书
某学校的2019年度工作报告范本
2019/10/11 职场文书
嵌入式Redis服务器在Spring Boot测试中的使用教程
2021/07/21 Redis