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

那怎么开始设计一个合格的类呢,一开始就写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思想的类封装完成了。

(0)

相关推荐

  • 简单谈谈PHP面向对象之标识对象

    标识对象模式 这个模式主要功能就是创建sql语句中的wehre条件字符串的,下面直接看代码和注释: namespace woo\mapper; //字段对象 class Field { protected $name = null; //字段名称 protected $operator = null; //操作符 protected $comps = array(); //存放条件的数组 protected $incomplete = false; //检查条件数组是否有值 function _

  • 实例讲解PHP面向对象之多态

    什么是多态性? 多态性是继数据库抽象和继承后,面向对象语言的第三个特征.多态即多种形态,具有表现多种形态的能力特征.在面向对象中表示根据对象的类型以不同方式处理.多态性允许每个对象以适合自身的方式去响应共同的消息.多态性增强了软件的灵活性和重用性. 如我们创建一个doing()方法,如果是学生则打印上课,如是公司职员则打印上班. 普通做法 使用if判断 复制代码 代码如下: /**  * PHP多态性  * 琼台博客  */   // 定义学生类 class student{     publi

  • PHP 面向对象详解

    对象的主要三个特性 对象的行为:可以对 对象施加那些操作,开灯,关灯就是行为. 对象的形态:当施加那些方法是对象如何响应,颜色,尺寸,外型. 对象的表示:对象的表示就相当于身份证,具体区分在相同的行为与状态下有什么不同. 面向对象模型 面向对象的概念: oop(面向对象的编程)它能是其代码更加简洁易于维护并且具有更强的可重性 什么是类: 类是具有相同属性和服务的一组对象的集合比如说人,书,轮船,车都属于类,他为属于该类的对象做了一个统一的抽象描述,在编程的语言中类是一个单独的程序,它应该有一个类

  • 老生常谈PHP面向对象之标识映射

    标识映射在数据映射器的基础上增加了标识映射类,主要功能是保存已经创建好的对象,在需要的时候可以直接获取而不是重复创建造成系统性能的下降. 在数据映射器基础上还增加了部分调用标识映射类的方法,示例代码如下: namespace woo\domain; //标识映射类 class ObjectWatcher{ private $all = array(); //存放对象的小仓库 private static $instance; //单例 private function __construct (

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

    那怎么开始设计一个合格的类呢,一开始就写class{}的都错了,正确的是什么都不写,而是假设这个类已经存在,这个对象已经存在,各种属性方法都已经有了,在这个完全的假设下想象下这个对象应该怎么用,例如我们制作一个缩略图的类,我们希望封装成一个类,方便下次使用,我们首先需要明确对象是什么它会做什么,要制作缩略图本质操作是缩小图片并输出,这里被操作的是图片,那么对象就是图片,由于网站上的图片不是唯一的我们得告诉这是那张图片,这就可以假设下这个类已经存在,一开始就得声明是那张图片,例如$simg = n

  • Python面向对象编程中的类和对象学习教程

    Python中一切都是对象.类提供了创建新类型对象的机制.这篇教程中,我们不谈类和面向对象的基本知识,而专注在更好地理解Python面向对象编程上.假设我们使用新风格的python类,它们继承自object父类. 定义类 class 语句可以定义一系列的属性.变量.方法,他们被该类的实例对象所共享.下面给出一个简单类定义: class Account(object): num_accounts = 0 def __init__(self, name, balance): self.name =

  • js es6系列教程 - 新的类语法实战选项卡(详解)

    其实es6的面向对象很多原理和机制还是ES5的,只不过把语法改成类似php和java老牌后端语言中的面向对象语法. 一.用es6封装一个基本的类 class Person{ constructor( uName ){ this.userName = uName; } sayName(){ return this.userName; } } 是不是很向php和java中的类, 其实本质还是原型链,我们往下看就知道了 首先说下语法规则: class Person中的Person就是类名,可以自定义

  • Yii2框架自定义类统一处理url操作示例

    本文实例讲述了Yii2框架自定义类统一处理url操作.分享给大家供大家参考,具体如下: 因为每个人写url的方式不一样,导致我们后期如果对url有修改的话,就非常麻烦. 所以我们需要来统一管理,同时还可以规范书写. 1.新建services\UrlService.php,services 是我们自定义的目录,专门用来写我们的各种自定义服务. <?php namespace app\services; use yii\helpers\Url; /** * 统一管理链接,并规范书写 * Class

  • Python抽象和自定义类定义与用法示例

    本文实例讲述了Python抽象和自定义类定义与用法.分享给大家供大家参考,具体如下: 抽象方法 class Person(): def say(self): pass class Student(Person): def say(self): print("i am student") 抽象类: 包含抽象方法的类 抽象类可以包含非抽象方法 抽象类可以有方法和属性 抽象类不能进行实例化 必须继承才能使用,且继承的子类必须实现所有抽象方法 import abc class Person(m

  • thinkPHP自定义类实现方法详解

    本文实例讲述了thinkPHP自定义类实现方法.分享给大家供大家参考,具体如下: 1.通过Model调用 <?php /** * 积分模型 api接口 */ class ApiModel{ private $url = 'http://js.yunlutong.com/Customer/Interface'; public function test() { $post_data['action'] = 'sadf'; $post_data['callback'] = '?'; $res = r

  • Android编程实现使用Intent传输包含自定义类的ArrayList示例

    本文实例讲述了Android编程实现使用Intent传输包含自定义类的ArrayList.分享给大家供大家参考,具体如下: 前言 之前项目中通过Intent只是传输简单的字符串,这次因为需要在前一个页面联网获取对象数据,然后在下一个页面使用,所以考虑到使用Intent传输包含自定义类的ArrayList. Serializable Java的对象序列化指的是将那些实现了Serializable接口的对象转换成一个字节序列,并且能在需要的时候再将这个字节序列完全恢复为之前的对象. 想实现对象的序列

  • PHP基于自定义类随机生成姓名的方法示例

    本文实例讲述了PHP基于自定义类随机生成姓名的方法.分享给大家供大家参考,具体如下: 自定义类rndChinaName.class.php: <?php Class rndChinaName { private $arrXing,$numbXing; private $arrMing,$numbMing; function rndChinaName() { $this->getXingList(); $this->getMingList(); } /* 获取姓列表 */ private

  • PHP基于面向对象封装的分页类示例

    本文实例讲述了PHP基于面向对象封装的分页类.分享给大家供大家参考,具体如下: <?php class Page { protected $num;//每页显示条数 protected $total;//总记录数 protected $pageCount;//总页数 protected $current;//当前页码 protected $offset;//偏移量 protected $limit;//分页页码 /** * 构造方法 * @param int $total 总记录数 * @par

  • ThinkPHP5.0框架控制器继承基类和自定义类示例

    本文实例讲述了ThinkPHP5.0框架控制器继承基类和自定义类.分享给大家供大家参考,具体如下: 继承系统控制器基类: <?php namespace app\index\controller; use think\Controller; class Index extends Controller { public function hello() { return 'hello,world'; } } 或者自定义一个基础控制器类Base: <?php namespace app\inde

随机推荐