PHP面向对象之自定义类实例教程
本文导语: PHP面向对象之自定义类实例教程 所谓面向对象就是什么时候什么东西做什么,设计类时需要想的就是怎么做的内容,那么怎么样的一个类才算是符合OOP的思想呢,答案是: 这个类写好之后,在使用的过程中,能准确的代表一...
PHP面向对象之自定义类实例教程
所谓面向对象就是什么时候什么东西做什么,设计类时需要想的就是怎么做的内容,那么怎么样的一个类才算是符合OOP的思想呢,答案是:
这个类写好之后,在使用的过程中,能准确的代表一个事物,在书写时代码要和思维描述一致,即这个东西做什么。
那怎么开始设计一个合格的类呢,一开始就写class{}的都错了,正确的是什么都不写,而是假设这个类已经存在,这个对象已经存在,各种属性方法都已经有了,在这个完全的假设下想象下这个对象应该怎么用,例如制作一个缩略图的类,希望封装成一个类,方便下次使用。
首先,需要明确对象是什么它会做什么,要制作缩略图本质操作是缩小图片并输出,这里被操作的是图片,那么对象就是图片,由于网站上的图片不是唯一的我们得告诉这是那张图片,这就可以假设下这个类已经存在,一开始就得声明是那张图片,例如$simg = new simg("1.jpg");那么,一张图片应该有哪些属性? 在制作缩略图时,最关心的应该是 宽,高,类型,而且这三项对一张图片而言是肯定的,这意味着这个对象一定有这些属性,$simg->width,$simg->height,$simg->type,并且这些属性一开始就可以读取的到的。
例子:
echo $simg->width;
echo $simg->height;
echo $simg->type;
//这个对象,应该可以这样操作。
根据oop的思想的原则,如果对象的属性被改变,对象应当也会发生相应的改变,这就意味着可以给它赋值,取得对象的宽度,高度,计算后(比如按比例缩小),重新赋值回去。
本质是要制作一张图片的缩略图,也就是生成一张新的图片,改变它之后,接下来要做的事情就应该是把这个改变过的图片存起来了,存起来是一个过程,所以它会是一个方法。
例如$simg->save(),考虑到要换一个地方存。至少要改一个名字吧,也就是说在使用时,这个对象应该是这样描述的,图片 保存到 …… 这意味着,这个方法,有一个参数,就是保存到哪。
例子:
$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(); //保存起来
这样会更明显一些,实例化一个缩略图,但它还不存在,直到保存以后它才存在于硬盘中 。
先按照第一种方式以原图为对象的角度创建这个类,根据上面的分析如下: