第二章(面向对象oop)《php和mysql web开发》《php与mysql程序设计》齐读

WBOY
Libérer: 2016-06-23 13:16:57
original
1026 Les gens l'ont consulté

目录Table Of Contents

  • 对象
  • 属性
  • 声明属性
  • 调用属性
  • 属性作用域
  • 属性重载
  • 方法
  • abstract作用域
  • 常量
  • 构造函数与析构函数
  • 构造函数
  • 调用父类构造函数
  • 调用无关的构造函数
  • 析构函数
  • 静态类成员

类表示要在应用程序中处理的实际事物。例如要创建一个管理图书的应用程序,类就是用来表示书,员工,顾客等,每个实体都包含一组性质和行为,在oop中分别称为属性property和方法method

< ?phpclass Employee{    private $name;  //属性    private $title;    protected $wage;    protected function clockIn() { //方法        echo "Member $this->$name clocked in at ".date("h:i:s");    }    protected function clockOut() {        echo "Member $this->$name clocked out at ".date("h:i:s");    }}?>
Copier après la connexion

对象

类提供了一个基础,可以在此基础上创建实体的特定实例,称为对象object,例如一个employee类可以创建员工a和b

< ?php$employee = new Employee();?>
Copier après la connexion

属性

声明属性

< ?phpclass Employee{    private $name;  //声明属性的有private,public,protected    private $title;    protected $wage;}?>
Copier après la connexion

调用属性

调用属性使用->操作符

< ?phpclass aa{    public $name = 'a';    function test() {        $this->name = $name; //this表示引用当前类    }}?>
Copier après la connexion

属性作用域

属性作用域有五种,public,private,protected,final,static

* public是默认的,声明公共作用域中的属性,公共属性可以由相应的对象直接访问和操作,但在oop不鼓励使用公共属性,避免被其他人访问和修改属性。

* private只能在定义属性中的类中被访问,并且不能由其子类使用,因为oop主要原则:封装,私有属性必须通过公共接口或者方法来访问

< ?phpclass aa{    private $name;    public function setName($name) { //通过了公共方法来设置私有属性        $this->name = $name;    }}$b = new aa;$b->setName("Mary");?>
Copier après la connexion

将属性的操作封装在一个方法中,可以让开发人员可以严密地控制如何设置属性。

  • protected只能在定义属性中的类中被访问,并且可以由其子类使用
  • final可以阻止子类覆盖这个属性,主要涉及到继承的时候的属性覆盖。
  • static就是static,静态域,静态变量,静态属性。

属性重载

属性重载是通过重载__set和__get方法来实现访问和修改属性的时候自动触发修改。

__set

< ?phpclass Employee{    var $name;    function __set($propName,$propValue){//__set方法有参数属性名和值,所以这里有2个变量        echo $propName."\n";    }}$employee = new Employee();$employee->name = "Mario"; //当触发修改属性的时候,就会触发__set方法,因为这里属性只有name而没有title,所以$employee->title = "hello";?>-----title //__set执行成功的话会返回true,失败就返回false,并且会执行函数内的代码,所以这里因为没有title属性,所以失败了,并且输出了失败的title属性。
Copier après la connexion

__get

类似__set

因为__set__get的关系,只能处理简单的属性,对于复杂的oop应用程序来说还是不足够的,所以需要实现自己的方法,考虑为每个私有属性创建两个方法:

< ?php    class Employee{        private $name;        public function getName(){            return $this->name;        }        public function setName($name){            $this->name = $name;        }    }?>
Copier après la connexion

方法

方法与函数非常相似,只不过方法用来定义类的行为。

php支持6种方法作用域:public,protected,private,abstract,final,static

public,protected,private,final,static跟变量的作用域很相似

abstract作用域

抽象方法,只在父类声明,但在子类实现,如果想定义一个应用编程接口API,以后将它作为实现的一个模型,就可以声明一个抽象方法

< ?phpabstract class Employee{    abstract function hire();    abstract function fire();}?>
Copier après la connexion

常量

常量constant,用来表示不会改变的值,在对象的整个生命周期中都保持不变。

< ?phpclass mathFunctions{    const PI = '3.1415926';}echo mathFuctions::PI;  ?>
Copier après la connexion

构造函数与析构函数

构造函数

构造函数是在实例初始化的时候自动执行的函数,可以接受参数,可以调用类和方法,可以调用其他构造函数。

< ?php    class Book{        private $title;        private $isbn;        private $copies;        function __construct($isbn) { //这个就是构造函数            $this->setIsbn($isbn); //这里自动读取参数,设置书编码            $this->getTitle(); //自动获取书title            $this->getNumberCopies(); //自动获取有多少本相同的书        }        public function setIsbn($isbn) {            $this->isbn = $isbn;  //将参数赋值到类的属性isbn        }        public function getTitle() {            $this->title = "hello,im a title!";            print ("Title: {$this->title}"."\n");        }        public function getNumberCopies() {            $this->copies = "5";            print ("Number copies available: {$this->copies}"."\n");        }    }    $book = new Book("061452424");?>----Title: hello,im a title!    //直接实例就能够有输出,自动的。Number copies available: 5
Copier après la connexion

每当实例化新对象时都会调用的方法,最好都通过构造函数完成,此外要确保这些方法只能在构造函数中被调用,需要设置private

调用父类构造函数

需要使用parent显式调用

< ?php    class Employee{        protected $name;        protected $title;        function __construct() {            echo "Employee constructor called!"."\n";        }    }    class Manager extends Employee{        function __construct() {            parent::__construct(); //实例Manager对象就能够执行了Employee对象的构造函数            echo "Manager constructor call!"."\n";        }    }    $employee = new Manager();?>----Employee constructor called!Manager constructor call!
Copier après la connexion

调用无关的构造函数

例如:classname::__constructor();
Copier après la connexion

析构函数

析构就是构造的反义,撤销对象的在内存的数据

< ?php    class Employee{        protected $name;        protected $title;        function __construct() {            echo "Employee constructor called!"."\n";        }        function __destruct() {            echo "Its destroyed!"."\n";        }    }    $employee = new Employee();?>----Employee constructor called!Its destroyed! //脚本执行结束就会撤销内存中的对象。
Copier après la connexion

静态类成员

当需要创建供所有类实例共享的属性和方法的时候,这些属性和方法与所有类实例有关,但不能由任何特定对象调用,例如编写一个类来跟踪网页访问者的数量,正常来的说,每次实例化类的时候都会将计数清零,所以需要设置static,静态类。

< ?phpclass Visitor{    private static $visitor = 0;  //设置了静态属性    function __construct() {        self::$visitor++; //静态属性和方法需要使用self来引用    }    static function getVistors() {  //设置了静态方法,其实这里不用static也可以,静态方法是可以不用实例化而直接调用的,这里因为构造函数实例化了,所以用不用static function都可以        return self::$visitor;    }}$visits = new Visitor();echo $visits::getVistors()."\n"; //静态方法需要使用::来调用$visits2 = new Visitor();echo $visits2::getVistors()."\n";?>----1   //计数没有终止,而是继续累计。2
Copier après la connexion

本文由 PeterYuan 创作,采用 署名-非商业性使用 2.5 中国大陆 进行许可。 转载、引用前需联系作者,并署名作者且注明文章出处。神一样的少年 » 第二章(面向对象oop)《php和mysql web开发》《php与mysql程序设计》齐读

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal