php5 面向对象

1.介绍
 早在PHP 3版本中,PHP就支持面向对象的编程(OOP)。虽然当时可以用面向对象编程,但是PHP对其的支持是非常简单的,而且到PHP 4时也没有得到大幅度的改进,这主要是考虑到向后兼容性的问题。后来因为广泛地提高了对OOP支持的要求,PHP 5才对整个面向对象的模型重新进行了设计,增加了大量的特性并且更改了“对象”本身的基础运行机制。


2.对象
 OOP与面向功能的编程最大的区别就是数据和代码是绑定到一个实体中的,这个实体就叫做对象


 面向对象的应用通常会被切割为许多对象,而且对象之间彼此交互。每一个对象一般都是一个问题的实体,它是独立的而且拥有许多属性和方法。


  属性就是对象的数据,它其实就是属于对象的变量。
  
  方法——如果你有面向功能的编程的背景——其实就是对象支持的函数。进一步说,在交互中访问并且使用别的对象的功能叫做对象的接口。


3.面向对象的好处:
  简单性: 因为面向对象语言里面的对象都是反映的真实世界的对象,所以复杂性就降低了而且程序结构也更加清晰;
 模块性: 每一个对象都来源于一个单独的实体, 它内部的工作与系统的其他部分是分离的
 易修改性: 在面向对象程序中对数据表现层和工作过程进行小的改动是非常简单的, 类内部的改动不会影响程序的其他部分,因为外边的程序与这个类的交互是通过一个公开的接口方法进行的。只要这个方法不改动就不会影响交互。
 可扩展性:在面向对象程序里面,添加新的功能只需要引入新的对象或者修改一下现存的对象。
 可维护性: 对象可以进行分别维护, 这样就使查找问题和修复问题变得简单了
 重用性:对象可以在不同的程序里面重用
 开发效率高:软件开发时,根据设计的需要对现实世界的事物进行抽象,产生类。使用这样的方法解决问题,接近于日常生活和自然的思考方式,势必提高软件开发的效率和质量


什么是面向对象:
   面向对象是一种思想,是一种设计模式,它可以使复杂的事物简单化,使人的思考角度从执行者变为指挥者;对象具有 状态、行为、标识(属性、行为、地址)
属性对应是类中的变量,行为对应的类中的函数(方法)


定义类,就是在描述事物,就是在定义属性和行为。属性和行为共同成为类的成员(成员变量和成员方法)




4.什么是类:
   类的概念:类是具有相同属性和服务的一组对象的集合。它为属于该类的所有对象提供了统一的抽象描述,其内部包括属性和服务两个主要部分。在面向对象的编程语言中,类是一个独立的程序单位,它应该有一个类名并包括属性说明和服务说明两个主要部分。


5.什么是对象
  对象的概念:对象是系统中用来描述客观事物的一个实体,它是构成系统的一个基本单位。一个对象由一组属性和对这组属性进行操作的一组服务组成。从更抽象的角度来说,对象是问题域或实现域中某些事物的一个抽象,它反映该事物在系统中需要保存的信息和发挥的作用;它是一组属性和有权对这些属性进行操作的一组服务的封装体。客观世界是由对象和对象之间的联系组成的。


6. 类与对象的关系就如模具和铸件的关系,类的实例化结果就是对象,而对一类对象的抽象就是类.类描述了一组有相同特性(属性)


7. 面向对象三大特征: 封装、继承、多态


什么是封装


   封装:在程序中隐藏对象的属性和实现细节,仅对外提供访问方式


    优点:1、将变化隔离  2、便于使用  3、提高重用性  4、提高安全性
    封装原则:
        1、将不需要对外提供的内容都隐藏起来。
        2、把属性都隐藏,提供公共方法对其访问
什么是继承
    继承:子类具备父类或者基类的属性或者方法,子类可以扩展属于自己的属性或方法 
    优点:1、继承与封装是相互作用的  2、便于扩展  3、提高重用性 


什么是多态:
  多态:多态性使指相同的操作或函数、过程可作用于多种类型的对象上并获得不同的结果。不同的对象,收到同一消息可以产生不同的结果,这种现象称为多态性。 
多态性允许每个对象以适合自身的方式去响应共同的消息。 
多态性增强了软件的灵活性和重用性。




3.在PHP中,用class关键字定义类,new关键字实例化对象.PHP中类属性指的是类中声明的变量,定义变量须用public private protected之一定义其访问权限.
  Public(公开): 可以自由的在类的内部外部读取、修改。
  Private(私有): 只能在这个当前类的内部读取、修改。
  Protected(受保护):能够在这个类和类的子类中读取和修改。


class person               //定义一个类
{
    private $name='T.F';   //定义一个私有属性
    private  $age='22';    //定义一个私有属性
    function getName()     //定义类中方法
    {
        //数组形式返回两个属性
        return $this-> name;
    }
    function getAge()
    {
        return $this-> age;
    }
    function getAll()
    {
        return array('age'=>$this->age,'name'=>$this->name);
    }
}


/实例化一个类




//演示类成员的访问,调用.
$who = new person();
echo "我的名字".$who->getName() . "<br>";
echo "我的年龄".$who->getAge() . "<br>";
print_r($who->getAll()); 
?>


注意,在上例中,方法内部调用本地属性时,使用 $this->name来获取属性。在这个例子中,设置了公开的getName()方法,即用户只能获取$name, 而无法改变他的值。这就是封装的好处。




4.通过方法定义时的参数,可以向方法内部传递变量。如果声明这个方法有参数,而调用这个方法时没有传递参数,或者参数数量不足,系统会报出错误。如果参数数量超过方法定义参数的数量,PHP就忽略多于的参数。不会报错。
另外可以在函数定义时为参数设定默认值。在调用方法时,如果没有传递参数,将使用默认值填充这个参数变量。


还可以向一个方法内部传递另外一个对象的引用变量。在方法内部,这个引用可以一直传递,在需要的时候,调用这个对象的属性和方法。


代码示例:


//类中添加如下方法
    function change($_age)
    {
        $this->a = $_age;
        return $this->a;
    }
    function change2($_age=88)
    {
        $this->a = $_age;
        return $this->a;
    }
//类中添加上述方法


//输出示例
echo "修改age为:".$who->change(99);                      //传递一个参数的演示
echo "<BR>";
echo "默认age为:".$who->change2();                         //传递为空时使用默认参数
echo "<BR>";
echo "传递对个参数的话".$who->change2(99,88);   //传递多个参数的话忽略多余的参数.
echo "<BR>";
echo $who->change($where)->getAge();                      //传递参数为对象的引用




5.对象的比较.在PHP中有 = 赋值符号、== 等于符号 和 === 全等于符号.


当使用比较操作符(==)时,对象以一种很简单的规则比较:当两个对象有相同的属性和值,属于同一个类且被定义在相同的命名空间中,则两个对


象相等。等于符号比较对象时,比较对象是否有相同的属性和值。使用 == 符号比较两个对象 ,比较的仅仅是两个对象的内容是否一致。


当使用全等符(===)时,当且仅当两个对象指向相同类(在某一特定的命名空间中)的同一个对象时才相等。
是否在是同一个对象,两边指向的对象是否有同样的内存地址。结果=== 比较的是两个变量是否一个对象


$me=new person();                                //用同一个类实例化两个对象
$you=new person();
if($me==$you)                                    //判断两者"=="结果
echo "me和you两个实例内容=="; 
else
echo "me和you两个实例内容不==";
echO "<BR>";
$you->change(66);                                //修改you实例中change方法中a属性后再判断==结果
if($me==$you)
echo "me和you修改后两个实例内容==";
else
echo "me和you修改后两个实例内容不==";  
echo "<BR>";
if($me===$you)  
echo "me和you两个实例内容==="; 
else
echo "me和you两个实例内容不===";
echO "<BR>";
$he=$you;                                      
if($he===$you)  
echo "he和you两个实例内容==="; 
else
echo "he和you两个实例内容不===";
echO "<BR>";
$you->change(66); 
if($he===$you)  
echo "修改后he和you两个实例内容==="; 
else
echo "修改后he和you两个实例内容不===";
echO "<BR>";




6.构造函数


构造方法又称为构造函数,是对象被创建时自动调用的方法,用来完成类初始化的工作。构造函数和其它函数一样,可以传递参数,可以设定参数默认值。构造函数可以调用属性,可以调用方法。构造函数可以被其它方法显式调用。在PHP4 中使用与类名同名的方法为构造函数。在PHP5中依然支持了这种方式,但不建议再使用这种方式。在PHP5中规定构造函数使用_ _construct() 函数表示构造函数,注意是两个 _ 。
class person
{
    private $name;
    private $age;
    public function __construct()
    {
        $this->name='T.F';
        $this->age='22';
        echo '构造函数在类被创建时调用<BR>';
        echo '初始化名字'.$this->name.'<BR>';
        echo '初始化年龄'.$this->age;
    }
}
$me=new person;


7.析构函数:当某个对象成为垃圾或者当对象被显式销毁时执行。GC(Garbage Collector)在PHP中,没有任何变量指向这个对象时,这个对象就成为垃圾。PHP会将其在内存中销毁。这是PHP的GC(Garbage Collector)垃圾处理机制,防止内存溢出。当一个PHP线程结束时,当前占用的所有内存空间都会被销毁,当前程序中的所有对象同样被销毁。__destruct() 析构函数,是在垃圾对象被回收时执行。析构函数也可以被显式调用,但不要这样去做。析构函数是由系统自动调用的,不要在程序中调用一个对象的虚构函数。析构函数不能带有参数。


php5.2与php5.3垃圾回收机制的区别:
  PHP5.2使用的是引用计数(Reference Counting)算法进行内存回收
  它的设计基本思想是:为每个内存对象分配一个计数器,当一个内存对象建立时计数器初始化为1(因此此时总是有一个变量引用此对象),以后每有一个新变量引用此内存对象,则计数器加1,而每当减少一个引用此内存对象的变量则计数器减1,当垃圾回收机制运作的时候,将所有计数器为0的内存对象销毁并回收其占用的内存。


  Reference Counting简单直观,实现方便,但却存在一个致命的缺陷,就是容易造成内存泄露。 
 比如:首先建立了数组a,然后让a的第一个元素按引用指向a,这时a的zval的refcount就变为2,然后我们销毁变量a,此时a最初指向的zval的refcount为1,但是我们再也没有办法对其进行操作,因为其形成了一个循环自引用。


PHP5.3改进了垃圾回收算法:
  PHP5.3的垃圾回收算法仍然以引用计数为基础,但是不再是使用简单计数作为回收准则,而是使用了一种同步回收算法
此算法的基本思想:首先PHP会分配一个固定大小的“根缓冲区”,这个缓冲区用于存放固定数量的zval,这个数量默认是10,000,如果需要修改则需要修改源代码Zend/zend_gc.c中的常量GC_ROOT_BUFFER_MAX_ENTRIES然后重新编译。
当根缓冲区满额时,PHP就会执行垃圾回收






   
















8.类的继承:


 继承是面向对象最重要的特点之一,就是可以实现对类的复用。通过“继承”一个现有的类,可以使用已经定义的类中的方法和属性。继承而产生的类叫做子类。 被继承的类,叫做父类,也被成为超类。 PHP是单继承的,一个类只可以继承一个父类,但一个父类却可以被多个子类所继承。从子类的角度看,它“ 继承(inherit , extends)”自父类;而从父类的角度看,它“派生(derive)”子类。它们指的都是同一个动作只是角度不同而已。子类不能继承父类的私有属性和私有方法。在PHP5中类的方法可以被继承,类的构造函数也能被继承。




class classmate                                          //构造一个类,他有两个私有属性,一个公共方法,和构造函数.
{


    private $className;
    private $schoolName;
    function __construct()
    {
        $this->className='02310302';
        $this->schoolName='BIT';
        echo '班级为'.$this->className;
        echo '学校为'.$this->schoolName.'<BR>';
    }
    function home($address)
    {
        $this->address=$address;
        return $this->address;
    }
}
class boy extends classmate {               //子类boy继承自classmate
    }
    $me=new boy();                          //实例化继承自clasasmate类的boy类,构造函数也被继承。
    echo '地址为'.$me->home('重庆');         //子类同样继承了父类的公共方法



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值