欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

十.PHP面向对象

程序员文章站 2024-03-17 16:26:52
...

一.继承

总结:

  1. public和protected成员可以被子类继承,private不能被继承。
  2. 一类最多同时继承一个类,不能同时继承多个类。
  3. 在子类中可以通过(父类名::父类的方法名或parent::父类的方法名)方法来访问父类的方法,前提是:父类的方法能够被继承才能访问(public、protected)。
  4. 如果子类和父类拥有相同的方法名,子类的会重写(覆盖)父类的方法。

例子:

<?php
class Student
{
    public $name;
    protected $age;
    protected $class;
    public funciton showName () {
        echo $this->name;

    }    
}
class Samson extends Student
{
    private $core;
    protected $phoneNum;
    public function __construct ($name) {
        $this->name = $name;
    }
}
$bestStu = new Samson('samson');
$bestStu->showName();

?>

注意:PHP并不像其他语言一样的通过参数列表来实现重载。

  • 属性的重载是通过__set  __get     __isset    __unset这些魔术方法实现的。
  • 方法的重载是通过__call这个魔术方法实现的。

例:

<?php
class Math
{
    public funtion add($num1, $num2) {

        return $num1 + $num2;

    }
    public funtion addMore($num1, $num2, $num3) {

        return $num1 + $num2 + $num3;
    }
    public function __call($name, $arguments) {
        if ($name == 'getResult') {
            if (count($arguments) == 2) {
                return  $this->add($arguments[0],  $arguments[1]);

            } else if ((count($arguments) == 3) {

                return  $this->addMore($arguments[0],  $arguments[1], $arguments[2]);
            }
        } else {
            echo '访问的方法不存在';

        }


    }

}
$math = new Math();
echo $math->getResult(1, 2);
echo $math->getResult(1, 2, 3);



?>

二.抽象类

  • 一旦使用abstract将类的某个方法声明为抽象方法了,这个类就是一个抽象类了,必须在类名前面加上abstract。
  • 抽象方法不能有函数体。
  • 抽象类不能实例化,只能被继承。
  • 一个类一旦有抽象方法,就必须将类声明为抽象类。
<?php
adstract class Ainimal
{

    abstract public function getName();
}

class Cat extends Ainimal
{
    public funtion getName() {

        echo '小猫';
    }
}
$cat = new Cat();
$cat-> getName();
?>

三.接口

定义:接口就是给出一些没有实现的方法,封装到一起,到某个类要使用的时候,再根据具体情况把这些方法写出来。(接口是更加抽象的抽象类,抽象类里的方法可以有方法体,接口里的所有方法都没有方法体。接口体现了程序设计的多态和高内聚  , 低偶合的设计思想。)

注意:

  • 接口不能被实例化。
  • 接口中可以有属性,但只能是常量 ,默认是public, 但不能用public 显式修饰。
  • 接口中的方法都必须是public的,默认就是public。
  • 一个类可以实现多个接口,逗号隔开 。
  • 一个接口不能继承其它的类,但是可以继承别的接口。

十.PHP面向对象

       PHP的继承是单继承,也就是一个类最多只能有一个父类,这种单继承的机制可保证类的纯洁性,比c++中的多继承机制简洁。    但是不可否认,对子类功能的扩展有一定影响.所以我们认为:    (1)实现接口可以看作是对 单继承的一种补充,还有一点,继承是层级式的,不太灵活。图示,这种结构修改某个类就会打破这种继承的平衡,而接口就没有这样的麻烦,因为它只针对实现接口的类才起作用。

四.final

使用情形:

  • 不希望父类的某个方法被子类重写(override时,可以用final关键字修饰。
  • 不希望类被继承时,可以用final修饰。

注意:

  • final不能够修饰成员属性(变量) 。
  • final 方法不能被重写,但可以被继承. 一般来说,final 类中不会出现final 方法,因为final类都不能被继承,也就不会去重写override final类的方法了。
  • final 类 是可以被实例化的。
final  class 类名{    //final 类,该类不能被继承 } 

class 类名{    final 修饰符 function 函数名(参数列表){}  // final 方法, 不能被重写 }

例子:

<?php
class Abc1{
    final public function test(){
	    echo 'hello,ok';
    }
}
class Abc2 extends Abc1{
    public function test2(){
	    echo 'hello,ok2';
    }
}
$x=new Abc2();
$x->test2();
echo '<br/>';
//调用父类的final方法
$x->test();
?>

五.const

基本用法:  

  • const 常量名=值。
  • 访问:          类名::常量名; 或  self::常量名     接口名::常量名 。
  •  常量名应全部大写,并且前面不要有$
const RATE = 3.1415926;

class Person {
const ARRAR = array(10, 90);

}
$p = new Person ();
echo Person::ARRAR[1];

六.对象遍历

1.语法

foreach($对象 as $key => $val)
{
	echo "$key = $val";
}

注意:在类外部遍历时,只能遍历到public 属性。

2.php内置标准类

不想定义一个类,可以考虑使用 PHP内置标准类 stdClass [standard标准]。

十.PHP面向对象

3.对象序列化和反序列化

前提:

一个php脚本执行完毕,里面的变量会被释放掉。

<?php
class Cat{

    public $name = '女王陛下';
    public $food = '鱼';
    public funciton skill() {
        echo "抓耗子";

    }


}
$cat = new Cat();

//对象转换成字符串
$catStr = serialize($cat);
file_put_contends('./cat,txt', $catStr);

?>
<?php

$cat = file_get_contents('./cat.txt');

//反序列化,字符串转换成对象
$cat= u'nserialize($cat);
file_put_contends('./cat,txt', $cat);

?>