已掉线,重新登录

首页 > 绿虎论坛 > 历史版块 > 编程 > PHP > 教程

标题: 面向对象快速入门

作者: @Ta

时间: 2012-11-03

点击: 8444

    本教程假设你了解PHP的变量、函数等基本知识,但完全不了解类与对象。本教程将用最简单的语言教你如何快速开始使用类与对象。注意,本教程仅仅教你怎么用类,而不会教你怎么写类。至于怎么写类,是下一篇教程的内容。

    
一、对象是什么:
    对象(英文Object)是PHP中的一种数据类型。你一定记得PHP中其他几种常见的数据类型:数字、字符串、数组----对象和它们一样,也是一种数据类型,所以也可以被赋值给变量,也可以做为函数的参数传递。
    如果你还是不能理解,你就把对象当成一个数组来看待吧。你可以在哪里使用数组,就可以在同样的地方使用对象。只不过,使用对象和数组的语法有些不同。并且对象的功能比数组更强大,因为它不仅可以存储数据,还可以存储函数。在面向对象的世界里,我们把对象存储的数据叫做对象的属性(英语Propertie),把对象存储的函数叫做对象的“方法”(英语Method)。
    
二、对象的基本语法
  1. 创建对象
    使用new关键字创建一个对象。
    new关键字的语法是:
        new 类名(参数1,参数2…)

        可以有无数个参数,也可以没有参数。如果没有参数,则类名后面的括号可以省略,写成 new 类名; 或 new 类名(); 都可以。
    你可能会问“类名”是什么。简单来说,类名就是类的名字(这个地球人都知道)。那么类是什么呢?继续简单来说,类是一个“函数库”。类中包含着许多预先定义好了的函数和变量,但这些函数和变量并不能直接使用。只有通过“new 类名()”语句把类“实例化”成一个对象之后,类中的函数和变量才能为我们所用。对,我们把从类中创建出对象的过程叫做类的实例化----类是一个模板,一张图纸,而对象则是根据这张图纸制造的实实在在可以使用的产品。
    正因为类是模板,所以显然我们可以同时实例化出很多不同的对象,它们刚生产出来时虽然一模一样,但我们可以让它们各自进行不同的工作。这就像我可以买两台一模一样的手机,一台用来看电影,一台用来听歌----于是我就可以边看电影边听歌,两台手机绝对不会互相影响(我听不听得清是我的事)。
    这个特性也是类/对象与函数相比的优点,同时也是面向对象和面向过程相比的不同点。
    我们知道,因为每个函数都是唯一的,所以为了让多个任务同时使用函数而互不干扰,每个任务都必须自行保存数据----我们不得不自行把一个函数的返回值用一个变量保存起来,然后再自行把它传递给另一个函数才能继续处理。
    但在面向对象中我们完全不必如此。因为对象里同时包含变量和函数(属性和方法),所以从设计良好的类中实例化出来的对象是可以“自行保存状态”的。所以,如果某种任务要两步才能处理完,我们就可以非常方便的同时实例化n个类,同时处理n个相同类型的任务,而不用担心自己需要用n个变量来保存第一步产生的中间数据并传递给第二步----我们唯一需要做的,就是找出n个变量来保存这n个彼此独立的对象。
    是的,因为对象和数组一样是种数据类型,所以对象通常是保存在变量中的。
    我们这样创建数组:
        $arr = array(1, 2, 3, 4, 5, 6, 7, 8, 9);
    所以我们也像这样创建一个对象并把它保存在变量中:
        $obj = new 类名(参数1, 参数2…);
    
    2. 调用对象的方法
    在开始这节之前,我们需要找个可用的类来实例化。你可以下载这个httplib类(不要解压,直接把文件名后缀.gz去掉就可以了)
    httplib类是一个由小毅创作并在玖玩浏览器中使用的HTTP通讯类。如果你使用过CURL,经过这教程之后你就会发现用它比用CURL函数库方便太多了。
<?php
include 'httplib.class.php';
$http=new httplib();
?>

    好了,我们已经创建出一个httplib对象并把它保存在$http变量中了。接着怎么用呢?如果我们要用它访问虎绿林首页并取得源代码,该怎么做呢?
    首先要认识一个新的操作符:
        ->
    这个操作符由减号和大于号组成,就像一个剪头,它的作用是操作对象的属性与方法。
    经过查看源文件中的帮助信息,我们知道了要打开一个网页首先要调用httplib类的open方法。open方法有三个参数:第一个是要打开网页的URL,第二个是连接超时时间,第三个是允许跳转的次数(防止循环重定向)。open之后,接着就是用send()方法发出HTTP请求,最后用response()方法得到结果。所以我们这样写(接着上面的代码写。<?php ?>标记是我为了让代码高亮生效而加上的,你写的时候不用重复写):
<?php
$http->open('http://hu60.cn/', 30, 5); //30秒超时,最多允许重定向跳转5次
$http->send();
$html=$http->response();
echo nl2br(htmlspecialchars($html));
?>

    这样,一个简单的源码查看器就完成了。
    但是如果我们要发送一个Cookie或POST数据怎么办呢?很简单,在send()之前调用cookie()或post()方法即可:
<?php
$http->open('http://hu60.cn/', 30, 5);
$http->cookie('sid','…我不会告诉你我的sid的…'); //设置cookie
$http->header('User-Agent','hu60 test browser'); //自定义浏览器UA
$http->send();
$html=$http->response();
echo nl2br(htmlspecialchars($html));
//还可以取得更多信息
echo '<hr/>当前网址:'.$http->url();
echo '<br/>页面类型'.$http->header('CONTENT-TYPE');
?>

    
  3. 访问属性
    访问对象的属性和访问数组成员类似,不过不是用[],而是依然使用->操作符:
<?php
if($http->returnerr) $http->returnerr=false;
?>

    这个就是读写对象属性的例子。
    但是除非迫不得已,否则直接操作对象的属性并不是一个好习惯。一般我们在发布一个类之后就不会改变其中的方法了,但属性却可能随时修改或用作它途。所以如果你直接操作对象的属性,当你把你用的类升级到新版本时,你可能就会发现你的程序工作不正常了,因为属性已经修改了。
    所以建议不要直接操作或读取对象的属性,而是尽量调用类的方法来完成任务。
    此外,对象的属性是可以临时创建的,比如:
<?php
$http->hu60=10086; //httplib类没有定义hu60属性,但我临时创建了一个
echo $http->hu60;
?>

    这个特性可以使你把对象当数组用,这样可以节省打引号的时间。如果你要把对象当数组用,可以使用stdclass实例化一个对象,stdclass是php自带的一个空类,即它没有任何属性和方法。它存在的唯一意义就是方便你把对象当数组用(因为对象必须从类中创建,走了stdclass你就不必自己写一个空类了)。
    好了,这个教程就结束了。你应该会用类了吧。下一节是关于类的常量、静态属性和静态方法的。

[隐藏样式|查看源码]


『回复列表(19|隐藏机器人聊天)』

1. {微笑}
(/@Ta/2012-11-03 15:46//)

2. 先"支持
(/@Ta/2012-11-03 15:47//)

3. 顶顶更健康
(/@Ta/2012-11-03 15:55//)

4. 虎哥~虎哥~虎哥无敌~寿与天齐~
(/@Ta/2012-11-03 16:04//)

5. 我承认~我想歪了
(/@Ta/2012-11-03 16:06//)

6. 尽管PHP4,5,未来的6逐渐转向OOP,但我永远也不会成为程序员,还是看看就得,不必深研究,还是写面向过程的吧~
(/@Ta/2012-11-03 16:31//)

7. 等更
(/@Ta/2012-11-03 17:14//)

8. 做等更新。
(/@Ta/2012-11-03 17:23//)

9. 抓紧更阿~虎哥,等着呐@老虎会游泳 
(/@Ta/2012-11-03 17:35//)

10. 完成
(/@Ta/2012-11-03 17:45//)

11. 我混乱了
(/@Ta/2012-11-03 17:53//)

12. 感觉有点像.h
(/@Ta/2012-11-03 18:10//)

13. @icEz 我也感觉类和C语言的差不多。@老虎会游泳 。是吧,虎哥。
(/@Ta/2012-11-03 18:12//)

14. @老虎会游泳  
一个文件内容如下

<?php
include 'httplib.class.php';
$http=new httplib();
?> 
    那个类文件要放在同目录下?
(/@Ta/2012-11-03 18:15//)

15. 感觉就很像,那C++的对象化会是怎么?@icEz
(/@Ta/2012-11-03 18:24//)

16. @我是五好学生  c是面向过程的吧
(/@Ta/2012-11-03 18:28//)

17. @icEz 对的。
(/@Ta/2012-11-03 18:28//)

18. @老虎会游泳 写个PDO操作SQLITE?
(/@Ta/2012-11-03 18:33//)

19. @icEz,是的。
(/@Ta/2012-11-03 18:52//)

回复需要登录

9月18日 21:58 星期四

本站由hu60wap6驱动

备案号: 京ICP备18041936号-1