下滑这里查看更多内容
什么是面向对象编程
把数据及对数据的操作方法放在一起,作为一个相互依存的整体——对象。对同类对象抽象出其共性,形成类。类中的大多数数据,只能用本类的方法进行处理。类通过一个简单的外部接口与外界发生关系,对象与对象之间通过消息进行通信。程序流程由用户在使用中决定。
什么是面向过程编程
自顶向下顺序执行,逐步求精;其程序结构是按功能划分为若干个基本模块,这些模块形成一个树状结构;各模块之间的关系尽可能简单,在功能上相对独立;每一模块内部均是由顺序、选择和循环三种基本结构组成;其模块化实现的具体方法是使用子程序。程序流程在写程序时就已决定。
面向对象编程和面向过程编程的区别
面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。 面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。
面向对象编程类和对象
- 类和对象的区别与联系:
- 类是抽象的,概念的,代表一类事物,比如人类,猫类;
- 对象是具体的,实际的,代表一个具体的事物;
- 类是对象的模板,对象是类的一个个体实例;
面向对象编程实例(详解)
- 以人为列子:
<?php
header("Content-type:text/html;charset=utf-8");
class person{
#下面是人的成员属性
var $name;
#人的名字
var $sex;
#人的性别
var $age;
#人的年龄
#定义一个构造方法参数为姓名$name,性别$sex和年龄$age
function __construct($name,$sex,$age){
#通过构造方法传进来的$name给成员属性$this->name赋初始值
$this->name=$name;
#通过构造方法传进来的$sex给成员属性$this->sex赋初始值
$this->sex=$sex;
#通过构造方法传进来的$age给成员属性$this->age赋初始值
$this->age="$age";
}
#下面是人的成员方法
function say()
#这个人可以说话的方法
{
echo "我的名字叫:".$this->name."性别;".$this->sex."我的年龄是:".$this->age."<br>";
}
function run() #这个人可以走路的方法
{
echo "这个人在走路";
}
#这是一个析构函数,在对象销毁前调用
function __destruct()
{
echo "再见".$this->name."<br>";
}
}
#通过构造方法创建3个对象$p1,$p2,$p3,分别传入三个不同的实参为姓名性别和年龄
$p1=new person("小明","男",20);
$p2=new person("熊","女",30);
$p3=new person("向日葵","男",25);
$p1->say();
$p2->say();
$p3->say();
#下面访问3个对象的说话方式$p1->say();$p2->say();$p3->say();
?>
- php面向对象的几个步骤
- 第一类的定义:
<?php
Class myobject{
#……
}
?>
- 第二成员方法:
<?php
classmyobject{
function getobjectname($name){
echo "商品名称为:".$name;
}
}
?>
- 第三类的实例化:
<?php
class myobject{
function getobjectname($name){
echo "商品名称为:".$name;
}
}
$c_book=new myobject(); #实例化对象
echo $c_book->getobjectname("计算机图书"); #调用getbookname()方法
?>
- 第四成员变量:
<?php
class myobject{
public $object_name;
functionsetobjectname($name){
$this->object_name=$name;
}
functiongetobjectname(){
return$this->object_name;
}
}
$c_book=new myobject();
$c_book->setobjectname("计算机图书");
echo $c_book->object_name."<br>";
echo $c_book->getobjectname();
?>
- 第五常量类: 既然有变量,当然也会有常量了。常量就是不会改变的量,是一个恒值。众所周知的一个常量就是圆周率Pi。定义常量使用关键字const如:ConstPI=3.14159;
<?php
class myobject{
const book_type="计算机图书"; #声明常量book_type
public $object_name; #声明变量
functionsetobjectname($name){ #声明方法setobjectname()
$this->object_name=$name; #设置成员的变量值
}
functiongetobjectname(){ #声明方法getobject()
return$this->object_name;
}
}
$c_book=new myobject(); #实例化对象
$c_book->setobjectname("PHP的类"); #调用方法setobjectname
echo myobject::book_type."<br>"; #输出常量的值
echo $c_book->getobjectname(); #调用方法getobjectname
?>
- 第六面向对象类的构造方法:
<?php
class myobject{
public $object_name; #商品名称
public $object_price; #商品价格
public $object_num; #商品数量
public $object_agio; #商品折扣
…………
}
?>
- 声明一个myobject类的对象,并对这个类的一些成员变量赋初值。代码如下:
<?php
class myobject{
public $object_name;
public $object_price;
public $object_num;
public $object_agio;
functiongetobjectname(){
return$this->object_name;
return$this->object_price;
return $this->object_num;
return $this->object_agio;
}
}
$dress=new myobject();
$dress->object_name="western-style clothes";
$dress->object_price=1500;
$dress->object_num=5;
$dress->object_agio=8;
echo $dress->getobjectname();
?>
Void__construect([mixed args,[……]])
注意:函数中的__是两条下划线,不是一条。 - 实例2:
<?php
class myobject{
public $object_name;
public $object_price;
public $object_num;
public $object_agio;
function__construct($name,$price,$num,$agio){ #通过参数给成员变量赋值
$this->object_name=$name;
$this->object_price=$price;
$this->object_num=$num;
$this->object_agio=$agio;
}
function setobjectname($name){
$this->object_name=$name;
}
function getobjectname1(){
return $this->object_name;
}
function getobjectname2(){
return $this->object_price;
}
}
$c_book=new myobject("western-styleclothes",1500,5,8);
echo $c_book->getobjectname1();
echo "<br>";
echo $c_book->getobjectname2();
?>
- 第七析构方法: 概念 析构方法的作用和构造方法正好相反,是对象被销毁时被调用的,作用是释放内存。析构方法的格式为:Void__destruct(void) 例:
<?php
class myobject{
public $object_name;
public $object_price;
public $object_num;
public $object_agio;
function__construct($name,$price,$num,$agio){ #通过参数给成员变量赋值
$this->object_name=$name;
$this->object_price=$price;
$this->object_num=$num;
$this->object_agio=$agio;
}
function setobjectname($name){
$this->object_name=$name;
}
function getobjectname1(){
return $this->object_name;
}
function getobjectname2(){
return $this->object_price;
}
function __destruct(){
echo "<p><b>对象被销毁,调用析构函数。</b></p>";
}
}
$c_book=new myobject("western-styleclothes",1500,5,8);
echo $c_book->getobjectname1();
echo "<br>";
echo $c_book->getobjectname2();
unset($c_book);
?>
PHP使用的是一种“垃圾回收”机制,自动清除不再使用的对象,释放内存。就是说即使不使用unset函数,析构方法也会自动被调用,这里只是明确一下析构函数在何时被调用。一般情况下是不需要手动创建析构方法的。
<?php
class myobject{
public $object_name;
public $object_price;
public $object_num;
public $object_agio;
function __construct($name,$price,$num,$agio){ #通过参数给成员变量赋值
$this->object_name=$name;
$this->object_price=$price;
$this->object_num=$num;
$this->object_agio=$agio;
}
function setobjectname($name){
$this->object_name=$name;
}
function getobjectname1(){
return$this->object_name;
}
function getobjectname2(){
return $this->object_price;
}
function __destruct(){
echo"<p><b>对象被销毁,调用析构函数。</b></p>";
}
}
$c_book=new myobject("western-styleclothes",1500,5,8);
echo $c_book->getobjectname1();
echo "<br>";
echo $c_book->getobjectname2();
?>
- 第八继承和多状态的实现:
Class subclass extends superclass{
……
}
说明:subclass为子类的名称,superclass为父类名称。 例:
<?php
class myobject{
public $object_name;
public $object_price;
public $object_num;
public $object_agio;
function__construct($name,$price,$num,$agio){ #通过参数给成员变量赋值
$this->object_name=$name;
$this->object_price=$price;
$this->object_num=$num;
$this->object_agio=$agio;
}
function showme(){
echo "这句话会输出吗?答案是不会。";
}
}
class book extends myobject{
public $book_type;
function__construct($type,$num){
$this->book_type=$type;
$this->object_num=$num;
}
functionshowme(){ #重写父类中的showme()方法。
return "本次新进".$this->book_type."图书".$this->object_num."本"."<br>";
}
}
class elec extends myobject{
function showme(){ #重写父类中的showme()方法
return "热卖商品:".$this->object_name."<br>"."原 价:".$this->object_price."<br>"."特 价".$this->object_price*$this->object_agio;
}
}
$c_book=new book("计算机类",1000); #声明一个book子类对象。
$h_elec=new elec("待机王XX系列",1200,3,0.8); //声明一个elec子类对象。
echo$c_book->showme()."<br>"; #输出book子类的showme()方法
echo $h_elec->showme(); #输出elec子类的是showme()方法
?>
子类继承了父类的所有成员变量和方法,包括构造函数。这就是继承的实现。 当子类被创建时,PHP会先在子类中查找构造方法。如果子类有自己的构造方法,PHP会先调用子类中的方法,当子类中没有时,PHP则会去调用父类中的构造方法。 两个子类重写了父类的方法showme(),所以两个对象虽然调用的都是showme()方法,但返回的却是两段不同的信息。这就是多态性的实现。 - 第九this−>和操作符的使用1、this-> 在 前面类的实例化中,对如何调用成员方法有了基本的了解,那就是用对象名加方法名,格式为“对象名->方法名”。但在定义类时(如 myobject),根本无法得知对象的名称是什么。这时如果调用类中的方法,就要用伪变量this−>。this的意思就是本身,所 以$this->只可以在类的内部使用。 例:
<?php
classexample{ #创建类example
function exam(){ #创建成员方法
if(isset($this)){ #判断变量$this是否存在
echo "\$this的值为:".get_class($this); #如果存在,输出$this所属类的名字
}else{
echo "$this未定义。";
}
}
}
$class_name=newexample(); #实例化对象
$class_name->exam(); #调用方法exam()
?>
Get_class函数返回对象所属类的名字,如果不是对象,则返回false。 - 第十公共、私有和保护 - public公共成员 顾名思义,就是可以公开的、没有必要隐藏的数据信息。可以在程序的任何地点(类内、类外)被其他的类和对象调用。子类可以继承和使用父类中所有的公共成员。 所有的变量都被声明为public,而所有的方法在默认的状态下也是public。所以对变量 和方法的调用显示得十分混乱。为了解决这个问题,就需要使用第二个关键字:private。 - private私有成员 被private关键字修饰的变量和方法,只能在所属类的内部被调用和修改,不可以在类外被访问。在子类中也不可以。 例:
<?php
class book{
private $name="computer";
public function setname($name){
$this->name=$name;
}
public function getname(){
return $this->name;
}
}
class lbook extends book{
}
$lbook=new lbook();
echo "正确操作私有变量的方法:";
$lbook->setname("PHP应用开发!");
echo $lbook->getname();
echo "直接操作私有变量的结果:";
echo book:name;
?>
对于成员方法,如果没有写关键字,那么默认就是public。从本节开始,以后所有的方法及变量都会带个关键字,这是一种良好的书写习惯。
- protected保护成员
private 关键字可以将数据完全隐藏起来,除了在本类外,其他地方都不可以调用。子类也不可以。但对于有些变量希望子类能够调用,但对另外的类来说,还要做到封装。 这时,就可以使用protected。被protected修改的类成员,可以在类和子类中被调用,其他地方则不可以被调用。
例:
<?php
class book{
protected $name="computer";
}
class lbook extends book{
public function showme(){
echo "对于protected修饰的变量,在子类中是可以直接调用的。如:\$name=".$this->name."<br>";
}
}
$lbook=new lbook();
$lbook->showme();
echo "但在其他的地方是不可以调用的,否则:";
$lbook->name="history";
?>