所谓面向对象就是什么时候什么东西做什么,我们设计类的时候需要想的就是怎么做的内容,那么怎么样的一个类才算是符合OOP的思想呢,答案是:这个类写好之后,在使用的过程中,能准确的代表一个事物,在书写的时候代码要和思维描述一致,即这个东西做什么。
  那怎么开始设计一个合格的类呢,一开始就写class{}的都错了,正确的是什么都不写,而是假设这个类已经存在,这个对象已经存在,各种属性方法都已经有了,在这个完全的假设下想象下这个对象应该怎么用,例如我们制作一个缩略图的类,我们希望封装成一个类,方便下次使用,我们首先需要明确对象是什么它会做什么,要制作缩略图本质操作是缩小图片并输出,这里被操作的是图片,那么对象就是图片,由于网站上的图片不是唯一的我们得告诉这是那张图片,这就可以假设下这个类已经存在,一开始就得声明是那张图片,例如$simg = new simg("1.jpg");那么,一张图片应该有哪些属性? 在制作缩略图的时候,我们最关心的应该是 宽,高,类型,而且这三项对一张图片而言是肯定的,这意味着这个对象一定有这些属性,$simg->width,$simg->height,$simg->type,并且这些属性一开始就可以读取的到的,
 $simg = new simg("1.jpg");
echo $simg->width;
echo $simg->height;
echo $simg->type;
//这个对象,应该可以这样操作。
  根据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 面向对象之自定义类的更多相关文章

  1. JS面向对象(1) -- 简介,入门,系统常用类,自定义类,constructor,typeof,instanceof,对象在内存中的表现形式

    相关链接: JS面向对象(1) -- 简介,入门,系统常用类,自定义类,constructor,typeof,instanceof,对象在内存中的表现形式 JS面向对象(2) -- this的使用,对 ...

  2. 面向对象:MATLAB的自定义类 [MATLAB]

    https://www.cnblogs.com/gentle-min-601/p/9785812.html 面向对象:MATLAB的自定义类 [MATLAB]   这几天刚刚开始学习MATLAB的面向 ...

  3. Python面向对象6:抽象类和自定义类

    抽象类- 抽象方法: 没有具体实现内容的方法成为抽象方法- 抽象方法的主要意义是规范了子类的行为和接口- 抽象类的使用需要借助abc模块 import abc - 抽象类:包含抽象方法的类叫抽象类,通 ...

  4. python面向对象反射-框架原理-动态导入-元类-自定义类-单例模式-项目的生命周期-05

    反射 reflect 反射(reflect)其实是反省,自省的意思 反省:指的是一个对象应该具备可以检测.修改.增加自身属性的能力 反射:通过字符串获取对象或者类的属性,进行操作 设计框架时需要通过反 ...

  5. 疯狂java学习笔记之面向对象(一) - 定义类、方法、构造器

    Java面向对象 1.定义类 2.创建对象.调用方法 类和对象: 某一类对象的概念定义. 比如:人类 - 抽象出来的概念(不特指某个人) 对象 - 在类的概念下产生的一个实例,它就是一个对象了. ja ...

  6. cocos2dx lua 绑定之二:手动绑定自定义类中的函数

    cococs2dx 3.13.1 + vs2013 + win10 1.首先按照<cocos2dx lua 绑定之一:自动绑定自定义类>绑定Student类 2.在Student类中增加一 ...

  7. Extjs-4.2.1(二)——使用Ext.define自定义类

    鸣谢:http://www.cnblogs.com/youring2/archive/2013/08/22/3274135.html --------------------------------- ...

  8. Javascript自定义类

    JavaScript并不是严格的面向对象的语言,但是带有面向对象的一些特性,我们可以通过这些特性创建js中的自定义类. JavaScript中的类其实是function关键字包裹的一系列变量和方法. ...

  9. ExtJS学习(一)Ext自定义类实现

    工作中项目需要extjs,所以学习一下,做个笔记防止遗忘了.以后回忆起来也方便. 首先下载extjs官网地址:http://extjs.org.cn/ 下载以后的目录结构: 先写一个入门的程序吧自定义 ...

随机推荐

  1. myBatis性能优化【转】

    官方doc文档 http://www.mybatis.org/mybatis-3/configuration.html#settings 最近测试发现个myBatis 有个比较严重的性能问题, 描述如 ...

  2. Mybatis上路_05-使用命令行自动生成

    http://my.oschina.net/vigiles/blog/125127 目录[-] 1.数据准备: 1)建库: 2)建表: 3)预设数据: 2.编写Generator执行配置文件: 3.搭 ...

  3. Eclipse导入Maven项目时class not found

    用maven开发javaweb项目可以自动导包,可以在配置文件pom.xml中发现依赖包,今天在eclipse中导入maven项目,开启tomcat服务器时报错 class not found, 看到 ...

  4. java 实现视频转换通用工具类:获取视频元数据信息(一)

    java 做视频转换主要用到开源的ffmpeg或者mencoder,还要有MP4Box. 注:由于平时都没有时间写博客,所以思路我就不写了,有问题问我,不一定马上回复. 详细介绍: ffmpeg:ht ...

  5. Activity 的启动模式

    好久没用过那几种activity的启动模式了,如今看到singletop竟然傻了眼,完全忘记了这几种启动模式的区别!隧将两年前的总结翻出来,通读一遍那晦涩难懂的记录,又理解了一遍,在以前记录的基础上, ...

  6. ios的@property属性和@synthesize属性

    当你定义了一系列的变量时,需要写很多的getter和setter方法,而且它们的形式都是差不多的,,所以Xcode提供了@property 和@synthesize属性,@property用在 .h ...

  7. oracle数据库导入导出的dmp(转)

    window下: imp必须要dba用户,所以用sysdba用户登陆,然后给予chnlmgr用户dba权限 grant connect,resource,dba to chnlmgr; 全部导入 im ...

  8. ssi(Server Side Includes)介绍

    Server Side Includes (SSI) is a simple interpreted server-side scripting language used almost exclus ...

  9. 一款很不错的FLASH时种插件

    直接贴一段代码上来,大家看看效果: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" " ...

  10. 玩转Android之加速度传感器的使用,模仿微信摇一摇

    Android系统带的传感器有很多种,最常见的莫过于微信的摇一摇了,那么今天我们就来看看Anroid中传感器的使用,做一个类似于微信摇一摇的效果. OK ,废话不多说,我们就先来看看效果图吧: 当我摇 ...