PHP学习之路——类与面向对象

类与面向对象

1、类和面向对象:类是面向对象程序的实际基本概念,通俗的理解类就是对现实中某一个种类的东西的抽象,比如汽车可以抽象为一个类,汽车拥有名字、轮胎、速度、重量等属性,可以有换挡、前进、后退等操作方法。通常定义一个汽车类的方法为:

class Car{

         $name = '汽车‘;

         function getName(){

                return $this->name;

         }

}

类是一类东西的结构描述,而对象则是一类东西的一个具体实例,例如汽车这个名词可以理解为汽车的总类,但是这辆汽车则是一个具体的汽车对象。对象通过new关键字进行实例化:

$car = new Car();       

echo $car->getName();

类与对象看起来比较相似,但实际上有本质的区别,类是抽象的概念,对象是具体的实例。类可以使程序具有可重用性。

例:                                                                                            输出:

<?php                                                                                            =>           
//定义一个类                                                                                      奥迪A6                                                                                                                               
class Car {
    var $name = '汽车';
    function getName() {
        return $this->name;
    }
}
//实例化一个car对象
$car = new Car();
$car->name = '奥迪A6'; //设置对象的属性值
echo $car->getName();  //调用对象的方法 输出对象的名字

?>


2、创建一个对象:类通过关键字class开头,然后是类名与花括号,在花括号中定义类的属性与方法。类名必须是字母或下划线开头,后面跟紧若干个字母、数字或下划线,类名最好能够表意,可以采用名称或者英文单词。

//定义一个类

class Car

{

     //定义属性

     public $name = '汽车';

     //定义方法

     public function getName()

     {

          //方法内部可以使用$this伪变量调用

             对象的属性或方法

          return $this->name;

     }

}

要创建一个类的实例,可以用new关键字创建一个对象。

$car = new Car();

$className = 'Car';

$car = new $className();

例:                                                            输出:

<?php                                                            =>            

//定义一个Car类并实例化一个对象                   宝马

    class Car

    {

        public $name = '汽车';

        public function gerName()

        {

             return $this->name;

         }

    }

    $car = new Car();

    $car -> name = '宝马';

    echo $car -> gerName();

?>


3、类的属性:在类中定义的变量称之为属性,通常属性跟数据库中的字段有一定的关联,因此也可以称做“字段”。属性声明是又关键字public,protected或者private开头,后面跟一个普通的变量声明来组成。属性的变量可以设置初始化的默认值,默认值必须是常量。访问控制的关键字代表的意义为:public:公开的,protected:受保护的,privare:私有的。

class Car

{

    //定义公共属性

    public $name = '汽车';

    //定义受保护的属性

    protected $corlor = '白色';

    //定义私有属性

    private $price = '100000';

}

默认都为public,外部可以访问。一般通过 -> 对象操作符来访问对象的属性或者方法,对于静态属性则使用  :: 双冒号进行访问。当在类成员方法内部调用的时候,可以使用$this伪变量调用当前对象的属性。

$car = new Car();

echo $car->name;//调用对象的属性

echo $car->color;//错误 ,受保护的属性不允许外部调用

echo $car->price;//错误,私有属性不允许外部调用

受保护的属性与私有属性不允许外部调用,在类的成员方法内部是可以调用的。

calss Car

{

    private $reice = '1000';

    public function gerPrice()

    {

        return $this->price;//内部访问私有属性

    }

}

例:                                                                   输出:

<?php                                                                   =>
class Car{                                                              品牌 :奥迪Q4
    //在这里定义一个共有属性name                         颜色 : 黑色
    public $name = '奥迪Q4';                                   价格 : 1000000
    protected $color = '黑色';
    private $price = '1000000';
    public function getColor()
    {
        return $this -> color;
        return $this -> price;
    }
    public function getPrice()
    {
        return $this -> price;
    }
}
$car = new Car();
//在这里输出$car对象的name属性
echo '品牌 : ' . $car->name . '<br />';
echo '颜色 : ' . $car -> getColor() . '<br />';
echo '价格 : ' . $car -> getPrice();
?>


4、定义类的方法:方法就是在类中的 function,很多时候我们分不清方法与函数有什么差别,在面向过程的程序设计中 function叫做 函数,在面向对象的程序设计中function则被称为 方法。同属性一样,类的方法也具有 publicprotected以及 private的访问控制。使用 static修饰的,称之为静态方法,静态方法不需要实例化对象,可以通过类名直接调用,操作符为双冒号 ::

例:                                                                   输出:

<?php                                                                    =>
class Car {                                                                 宝马
    public $speed = 0;                                                 10
    //增加speedUp方法,使speed加10
    public static function getName()
    {
        return "宝马";
    }
    public function speedUp()
    {
        $this->speed += 10;
    }
}
$car = new Car();
echo Car::getName() . '<br />';
$car->speedUp();
echo $car->speed;

?>


5、构造函数和析构函数:PHP5中可以在类中使用__construct()定义一个构造函数,具有构造函数的类,会在每次对象创建的时候调用该函数,因此常用来在对象创建的时候进行一些初始化工作。

class Car {

   function __construct()

   {

        print  "构造函数被调用\n";

    }

}

$car = new Car();//实例化的时候会自动调

用构造函数__construct,这里会输出一个字符串

在子类中如果定义了__construct则不会调用父类的__constuct,如果需要同时调用父类的构造函数,需要使用Parent::__construct()显示的调用。

class Car

{

     function __construct()

     {    
            print "父类构造函数被调用\n";

     }

}

class Truck extends Car

{

     function __construct()

     {    
                print  "子类构造函数被调用\n";
                 parent::__construct();

      }

}

$car = new Truck();

同样,PHP5支持析构函数,使用__destruct()定义,析构函数指的是当某个对象的所有引用被删除,或者对象被显示的销毁时会执行的函数。

class Car

{

         function  __construct()

         {

                  print "构造函数被调用\n";                 

         }

         function  __destruct()

         {

                  print  “析构函数被调用\n”;

         }

}

$car = new Car();//实例化时会调用构造函数

echo '使用后,准备销毁car对象\n';

unset($car);//销毁时会调用析构函数

当PHP代码执行完毕后,会自动回收与销毁对象,因此一般情况下不需要显示的去销毁对象。

例:                                                        输出:

<?php                                                        =>        
class Car {                                                   构造函数被调用         
    //增加构造函数与析构函数                        析构函数被调用        
    function __construct()
    {
        print "构造函数被调用\n";
    }
    function __destruct()
    {
        print "析构函数被调用\n";
    }
}
$car = new Car();
?>


6、Static静态关键字:静态属性与方法可以在不是化类的情况下调用,直接使用类名 ::方法名的方式进行调用。静态属性不允许对象的使用->操作符调用。

class Car

{

   private static $speed = 10;

   public static function getSpeed()

   {

      return self::$speed;  

   }

}

echo Car::getSpeed();//调用静态方法

静态方法也可以通过变量来进行动态调用。

$func = 'getSpeed';

$className = 'Car';

echo $className::$func();//动态调用静态方法

静态方法中,$this伪变量不允许使用。可以使用selfparentstatic在内部调用静态方法和属性。

class Car 

{

     private static $speed = 10;

     public static function getSpeed()

    {

        return  self::$speed;

    }

    public static function speedUp()

    {

        return self::$speed += 10;

    }

}

class BigCar extends Car

{

    public static function start()

    {

        parent::speedup();

    }

}

BIgCar::start();

echo::BIgCar::getSpeed();

}

例:                                                                                                     输出:

<?php                                                                                                       =>
class Car {                                                                                                   20
    private static $speed = 10;
    public function getSpeed() {
        return self::$speed;
    }
    //在这里定义一个静态方法,实现速度累加10
    public static function speedUp()
    {
        return self::$speed += 10;
    }
}
$car = new Car();
Car::speedUp();  //调用静态方法加速
echo $car->getSpeed();  //调用共有方法输出当前的速度值

?>


7、待续……

你可能感兴趣的:(PHP学习之路——类与面向对象)