前面的话

  php实现面向对象的一个显著特征是大量使用关键字,本文将详细介绍关键字

public

  public表示公有,它具有最大的访问权限,被定义为公有的类成员可以在任何地方被访问

  如果属性用 var 定义,则被视为公有,如果方法没有设置关键字,则该方法默认为公有

  1. <?php
  2. class demo{
  3. public $public = 1;
  4. function test($var){
  5. echo "{$var}000";
  6. }
  7. }
  8. $d1 = new demo;
  9. $d1->test($d1->public);//
  10. ?>

protected

  protected表示受保护的,被定义为受保护的类成员则可以被其自身以及其子类和父类访问

  1. <?php
  2. class demo{
  3. protected function fn(){
  4. echo '111';
  5. }
  6. }
  7. class demo1 extends demo{
  8. function test(){
  9. parent::fn();
  10. }
  11. }
  12. $d1 = new demo1;
  13. $d1->test();//
  14. ?>

private

  private表示私有的,被定义为私有的类成员则只能被其定义所在的类访问

  1. <?php
  2. class demo{
  3. private $private = 1;
  4. function test(){
  5. echo($this->private);
  6. }
  7. }
  8. $d1 = new demo;
  9. $d1->test();//
  10. ?>

final

  PHP5新增了final关键字,它只能用来修饰类和方法,不能使用final这个关键字来修饰成员属性,因为final是常量的意思,我们在PHP里定义常量使用的是define()函数和const关键字,所以不能使用final来定义成员属性

  如果父类中的方法被声明为final,则子类无法覆盖该方法。如果一个类被声明为 final,则不能被继承

  1. <?php
  2. class BaseClass {
  3. public function test() {
  4. echo "BaseClass::test() called\n";
  5. }
  6. final public function moreTesting() {
  7. echo "BaseClass::moreTesting() called\n";
  8. }
  9. }
  10. class ChildClass extends BaseClass {
  11. public function moreTesting() {
  12. echo "ChildClass::moreTesting() called\n";
  13. }
  14. }
  15. // Results in Fatal error: Cannot override final method BaseClass::moreTesting()
  16. ?>

static

  static关键字表示静态的意思,用于修饰类的成员属性和成员方法(即为静态属性和静态方法)

  类中的静态属性和静态方法不用实例化(new)就可以直接使用类名访问

  [注意]静态属性不能通过一个类已实例化的对象来访问,但静态方法可以

  由于静态方法不需要通过对象即可调用,所以伪变量 $this 在静态方法中不可用,静态属性不可以由对象通过 -> 操作符来访问

  用静态方式调用一个非静态方法会导致一个 E_STRICT 级别的错误

  就像其它所有的 PHP 静态变量一样,静态属性只能被初始化为文字或常量,不能使用表达式。所以可以把静态属性初始化为整数或数组,但不能初始化为另一个变量或函数返回值,也不能指向一个对象

  1. <?php
  2. class Foo
  3. {
  4. public static $my_static = 'foo';
  5. public function staticValue() {
  6. return self::$my_static;
  7. }
  8. }
  9. class Bar extends Foo
  10. {
  11. public function fooStatic() {
  12. return parent::$my_static;
  13. }
  14. }
  15. print Foo::$my_static . "\n";//'foo'
  16. $foo = new Foo();
  17. print $foo->staticValue() . "\n";//'foo'
  18. print $foo::$my_static . "\n";//'foo'
  19. print $foo->my_static . "\n"; //报错
  20. ?>

  static的常用场景是迭代器中

  1. function test(){
  2. static $count = ;
  3. $count++;
  4. echo $count.' ';
  5. if($count<){
  6. test();
  7. }
  8. }
    test();

const

  可以把在类中始终保持不变的值定义为常量。在定义和使用常量的时候不需要使用$符号,而是使用const

  常量的值必须是一个定值,不能是变量,类属性,数学运算的结果或函数调用

  1. <?php
  2. class MyClass
  3. {
  4. const constant = 'constant value';
  5. function showConstant() {
  6. echo self::constant . "\n";
  7. }
  8. }
  9. echo MyClass::constant . "\n";//'constant value'
  10. $classname = "MyClass";
  11. echo $classname::constant . "\n"; //'constant value'
  12. $class = new MyClass();
  13. $class->showConstant();//'constant value'
  14. echo $class::constant."\n";//'constant value'
  15. ?>

this

  当一个方法在类定义内部被调用时,有一个可用的伪变量this,特殊对象的引用this就是在对象内部的成员方法中,代表本对象的一个引用,但只能在对象的成员方法中使用,不管是在对象内部使用$this访问自己对象内部成员。还是在对象外部通过对象的引用名称访问对象中的成员,都需要使用特殊的运算符“->”来完成访问

  [注意]this在静态方法中不可用

  1. <?php
  2. class A
  3. {
  4. function foo()
  5. {
  6. if (isset($this)) {
  7. echo '$this is defined (';
  8. echo get_class($this);
  9. echo ")\n";
  10. } else {
  11. echo "\$this is not defined.\n";
  12. }
  13. }
  14. }
  15. class B
  16. {
  17. function bar()
  18. {
  19. // Note: the next line will issue a warning if E_STRICT is enabled.
  20. A::foo();
  21. }
  22. }
  23.  
  24. $a = new A();
  25. $a->foo();//$this is defined (A)
  26. A::foo();//$this is not defined.
  27. $b = new B();
  28. $b->bar();//$this is defined (B)
  29. B::bar();//$this is not defined.
  30. ?>

self

  在类的方法中,不能用this来引用静态变量或静态方法,而需要用self来引用

  1. <?php
  2. class MyClass
  3. {
  4. const constant = 'constant value';
  5. static function showConstant() {
  6. echo self::constant . "\n";
  7. }
  8. }
  9. $var = new MyClass;
  10. echo $var->showConstant();//constant value
  11. ?>

parent

  parent用于在子类中调用父类中定义的成员方法或常量

  1. <?php
  2. class MyClass{
  3. function fn(){
  4. echo('111');
  5. }
  6. const A = 'a';
  7. }
  8. class Class1 extends MyClass{
  9. function test(){
  10. echo parent::fn().parent::A;
  11. }
  12. }
  13. $var = new Class1;
  14. $var->test();//111a
  15. ?>

前端学PHP之面向对象系列第四篇——关键字的更多相关文章

  1. 前端学PHP之面向对象系列第四篇-----关键字

    public public表示公有,它具有最大的访问权限,被定义为公有的类成员可以在任何地方被访问 如果属性用 var 定义,则被视为公有,如果方法没有设置关键字,则该方法默认为公有 <?php ...

  2. 前端学PHP之面向对象系列第六篇——简单图形面积计算器实现

    前面的话 本文用面向对象的技术来实现一个简单的图形面积计算器 图形类 //rect.class.php <?php abstract class Shape{ public $name; abs ...

  3. 前端学PHP之面向对象系列第五篇——对象操作

    × 目录 [1]对象克隆 [2]对象比较[3]对象串行化[4]json 前面的话 本文主要介绍面向对象中的一些对象操作 对象克隆 对象复制,又叫对象克隆,可以通过 clone 关键字来完成 在多数情况 ...

  4. 前端学PHP之面向对象系列第三篇——三大特性

    × 目录 [1]封装 [2]继承[3]多态 前面的话 php面向对象编程的三大特性是封装性.继承性和多态性.本文将介绍php的这三大特性 封装 封装就是把对象中的成员属性和成员方法加上访问修饰符( p ...

  5. javascript面向对象系列第四篇——选项卡的实现

    前面的话 面向对象的应用并非只是读几本书那么容易,需要有大量的工程实践做基础才能真正理解并学会使用它.本文将用面向对象的技术来制作一个简单的选项卡 图示说明 由图示结果看到,这是一个非常简单的选项卡. ...

  6. 前端学PHP之面向对象系列第二篇——魔术方法

    × 目录 [1]构造方法 [2]析构方法 [3]不可访问属性[4]对象复制[5]字符串[6]对象不存在[7]自动加载类[8]串行化[9]函数调用 前面的话 php在面向对象部分有很多相关的魔术方法,这 ...

  7. 前端学PHP之面向对象系列第一篇——类和对象

    × 目录 [1]类 [2]成员属性[3]成员方法[4]对象[5]成员访问[6]this 前面的话 面向对象程序设计(OOP)是一种计算机编程架构.计算机程序由单个能够起到子程序作用的单元或对象组成,为 ...

  8. javascript面向对象系列第四篇——OOP中的常见概念

    前面的话 面向对象描述了一种代码的组织结构形式——一种在软件中对真实世界中问题领域的建模方法.本文将从理论层面,介绍javascript面向对象程序程序(OOP)中一些常见的概念 对象 所谓对象,本质 ...

  9. 前端工程师技能之photoshop巧用系列第四篇——图片格式

    × 目录 [1]图片格式 [2]保存设置 前面的话 对于前端来说,图片格式是需要重要掌握的知识.本文是photoshop巧用系列第四篇——图片格式 图片格式 目前在前端的开发中常用的图片格式有jpg. ...

随机推荐

  1. jQuery的选择器中的通配符

    (1)通配符: $("input[id^='code']");//id属性以code开始的所有input标签 $("input[id$='code']");// ...

  2. MySQL表的四种分区类型

    MySQL表的四种分区类型 一.什么是表分区 通俗地讲表分区是将一大表,根据条件分割成若干个小表.mysql5.1开始支持数据表分区了. 如:某用户表的记录超过了600万条,那么就可以根据入库日期将表 ...

  3. jsfl脚本设置导出AS链接名遇到的奇怪问题

    今天写jsfl脚本发现一个奇怪的问题,脚本用于对库对象设置AS链接名,代码如下: var item = fl.getDocumentDOM().library.items[0];var exportN ...

  4. CSS居中demo

      <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&q ...

  5. javascript模块化编程(三):require.js用法

    本文来自阮一峰 这个系列的第一部分和第二部分,介绍了Javascript模块原型和理论概念,今天介绍如何将它们用于实战. 我采用的是一个非常流行的库require.js. 一.为什么要用require ...

  6. mailto

    什么是mailto链接? mailto链接是一种html链接,能够设置你电脑中邮件的默认发送信息.但是需要你电脑中安装默认的E-mail软件,类似Microsoft Outlook等等.加入您已经安装 ...

  7. TreeView 使用方法:(在View.Details模式下)

    1.建立TreeView的標題         2.建立TreeView的Item         3.在TreeView的Item中的建立SubItem                  如果將各部 ...

  8. Call for Papers IEEE/ACM International Conference on Advances in Social Network Analysis and Mining (ASONAM)

    IEEE/ACM International Conference on Advances in Social Network Analysis and Mining (ASONAM) 2014 In ...

  9. SQL Server无法收缩日志文件 2 因为逻辑日志文件的总数不能少于 2问题

    SQL Server无法收缩日志文件 2 因为逻辑日志文件的总数不能少于 2问题 最近服务器执行收缩日志文件大小的job老是报错 我所用的一个批量收缩日志脚本 USE [master] GO /*** ...

  10. SQL SERVER 2016 AlwaysOn 无域集群+负载均衡搭建与简测

    之前和很多群友聊天发现对2016的无域和负载均衡满心期待,毕竟可以简单搭建而且可以不适用第三方负载均衡器,SQL自己可以负载了.windows2016已经可以下载使用了,那么这回终于可以揭开令人憧憬向 ...