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

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

WBOY
WBOYOriginal
2016-06-23 13:16:571027Durchsuche

目录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");    }}?>

对象

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

< ?php$employee = new Employee();?>

属性

声明属性

< ?phpclass Employee{    private $name;  //声明属性的有private,public,protected    private $title;    protected $wage;}?>

调用属性

调用属性使用->操作符

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

属性作用域

属性作用域有五种,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");?>

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

  • 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属性。

__get

类似__set

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

< ?php    class Employee{        private $name;        public function getName(){            return $this->name;        }        public function setName($name){            $this->name = $name;        }    }?>

方法

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

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

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

abstract作用域

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

< ?phpabstract class Employee{    abstract function hire();    abstract function fire();}?>

常量

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

< ?phpclass mathFunctions{    const PI = '3.1415926';}echo mathFuctions::PI;  ?>

构造函数与析构函数

构造函数

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

< ?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

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

调用无关的构造函数

例如:classname::__constructor();

析构函数

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

< ?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! //脚本执行结束就会撤销内存中的对象。

静态类成员

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

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

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn