前  言

 OOP 

  学习了好久的PHP,今天来总结一下PHP中的重要成员OOP

1  面向过程&面向对象
   
   1、专注于解决一个问题的过程。面向过程的最大特点,是由一个一个的函数去解决处理这个问题的一系列过程。

2、专注于由哪个对象来处理一个问题。面向对象的最大特点,是一个个具有属性和功能的类,从类中拿到对象,进而处理问题。
         

2  面向对象
   
    1、什么是类?
              具有相同属性(特征)和方法(行为)的一系列个体的集合,类事一个抽象的概念。

2、什么是对象?
              从类中,拿到的具有具体属性值得个体,称为对象。 对象是一个具体的个体。
     
         3、类和对象的关系?
              类是对象的抽象化!对象是类的具体化!
              类仅仅表明这类对象有哪些属性,但是不能有具体的值,所以类是抽象的。
              而对象,是将类的所有属性复制后,产生的具体的个体,所有对象是具体的。
     
         

3  类的声明与实例化
   
   1.如何声明一个类:
        class  类名{
          访问修饰符   $属性;
         [访问修饰符] function 方法(){}
            }
      2.声明一个类的注意事项:
        ①类名只能由字母数字下划线组成,开头不能是数字,必须符合大驼峰法则;
        ②类名必须使用class修饰,类名后面一定不能有();
        ③属性必须要带访问修饰符,方法可以不带访问修饰符;
      3.实例化对象及对象属性方法的调用
         $对象名 =new 类名();//()可以不带
         类外部调用属性和方法:
         $对象名->属性名;//使用->调用属性时,属性名不能带$
     
         类内部调用属性和方法:
         $this->属性名
            
         
4  构造函数/析构函数
   
       1、什么是构造函数?
              构造函数是类中的一个特殊函数,当我们使用new关键字实例化对象时,相当于调用了类的构造函数;
     
      2、构造函数有什么作用?
              实例化对象时,自动调用,用于给对象的虎山行赋初值!
     
      3、构造函数的写法?
              ① 构造函数名,必须与类同名
              [public] function Person($name){
                      $this->name =$name;
                          }
             
              ② 使用魔术方法__construct
             
              [public] function __construct($name){
                          $this->name =$name;    }
                     
      4、构造函数的注意事项:
              ① 第一种写法,构造函数名必须与类同名。
              ② 如果一个类没有手写构造函数,则系统默认会有一个空参构造,因此可以使用 new Person();
                  如果我们写了带参的构造函数,则将不会再有空参构造,也就是不能直接使用new Prenson();Person; Person后面的()中的参数列表,必须符合构造函数的要求!!!!!
              ③ 如果两种构造函数同事存在,将使用__construct。

5、析构函数: __destruct():
              ① 析构函数在对象被销毁释放之前自动调用!
              ② 析构函数不能带有任何的参数
              ③ 析构函数常用于对象使用完以后,释放资源、关闭资源等!
         

5  魔术方法 
   
      php,中,给我们提供一系列用__开头的函数,这些函数无需自己手动调用,会在何时的时机自动调用,这类函数称为魔术函数。
     
          例如:function __construct(){} 在类new一个对象时自动调用
                function __destruct(){} 在对象被销毁时自动调用
     
              我们要求,除了魔术方法之外,自定义的函数与方法不能使用__开头。
     
      最后,一般对于功能比较复杂的类,我们会单独的写到一个类文件中。
      类文件的命名,统一小写,使用“类名小写.class.php”的方式命名。
      在其他文件中使用这个类时,可以用include导入这个.class.php文件。
     
         
6  重点来了--php中的封装
   
  1、什么是封装?
          通过访问修饰符,将类中不需要外部访问的属性和方法进行私有化处理,以实现访问控制。
          注意:是实现访问控制,而不是拒绝访问。也就是说,我们私有化属性之后,需要提供对应的方法,让用户通过我们提供的方法处理属性。
     
     2、封装的作用?
     
          ① 使用者只关心类能够提供的功能,而不必关心功能实现的细节!(封装方法)
       ② 对用户的数据进行控制,防止设置不合法数据,空置房会给用户的数据(属性封装 set/get 方法)
     
     3、实现封装操作?
          ① 方法的封装
              对于一些只在类内部使用的方法,而不向对外部提供使用。那么,这样的方法我们可以使用private 进行私有化处理。
              privatefunction formatName(){}
              function showName(){
                  $this -> formatName();
                  }
       ② 属性的封装
              为了控制舒心的设置以及读取,可以将属性进行私有化处理,并要求用户通过我们提供的set/get方法进行设置
              private $age;
              function setAge($age){
              $this->age = $age;
              }
              function getAge($age){
               return this->age
              }
         
             $对象-> setAge("")
              $对象-> getAge("")
     
          ③ 属性的封装+set/get 方法
              private $age;
              function __get($key){
                  return $this->$ket;    
              }
             
              function __set($key,$value){
                  return $this->$key=$value
                  }
              $对象->age;    //访问兑现公司有属性是,自动调用__get()魔术方法,并将访问的属性名传给__get()方法。    
              $对象->age=12;    //设置对象私有属性时,自动调用__set()魔术方法,并且将这是的属性名以及属性值传给__set()方法;
     
      注意:在魔术方法中,可以使用分支结构,判断$key的不同,进行不同操作。
     
      4、关于封装的魔术方法:
              ① __set($key,$value):给类私有属性赋值时自动调用,调用时给方法传递两个参数:需要设置的属性名、属性值
              ② __get($key):读取类私有属性是自动调用,调用时给方法传递一个参数:需要读取的属性名;
              ③ __isset($key):外部使用isset()函数检测私有属性是,自动调用。。
                  >>> 类外部使用 isset();检测私有属性,默认是检测不到的。  false
                  >>> 所以,我们可以是用__isset();函数,在自动调用时,返回内侧检测结果。
              function __isset($key){
                  return isset($this->$key);    
              }        
             
              当外部使用isset($对象名->私有属性);检测时,将自动调用上述__isset()返回结果!
              ④ __unset($key):外部使用unset()函数删除私有属性时,自动调用;
              function __unset($key){
                  unset($this->$key);
              }
              当外部使用unset($对象名->私有属性);删除属性时,自动将属性名传给__unset(),并交由这个魔方方法处理。
             
         
     class Person{
private $name;
private $age;
private $sex;
public function __construct($name,$age,$sex){
$this->name=$name;
$this->age=$age;
$this->sex=$sex;
}
function __isset($key){
return isset($this->$key);
}
function __unset($name){
if($name=="name"){
echo "<span style='color:red;'>删除不掉name</span><br>";
return;
}
unset($this->$name);
return;
}
function __set($key,$value){
if($key=="name"){
$this->$key=$value."这是set出的。";
return;
}
$this->$key=$value;
}
function setAge($age){
if($age<=120&&$age>=0){
$this->age =$age;
}else{
error_log("年龄设置有误");
}
}
function getAge($age){
return "但是我永远18岁,哈哈哈哈哈哈。" ;
}
function __get($key){
return $this->$key."hahahah";
}
private function formateName(){
return "我叫{$this->name},我今年{$this->age}岁了!<br>";
}
public function say(){
echo $this->formateName();
}
}
$zhangsan = new Person("张三丰",14,"男");
//$zhangsan->setAge(99);
//$zhangsan->say();
//echo $zhangsan->getAge("88");
//$zhangsan->name="李四";
// $zhangsan->name="李四";
echo $zhangsan->name;
echo $zhangsan->age;
var_dump(isset($zhangsan->age));
unset($zhangsan->age);

继承的一点演示代码

7  重点来了--php中的继承
   
  1、如何实现继承?
              给子类使用extends关键字,让子类继承父类;
              class Stydent extends Person{}
     
      2、实现继承的注意事项?
             ① 子类只能继承父类的非私有属性;
              ② 子类继承父类后,相当于将父类的属性和方法copy到子类,可以直接使用$this调用该属性。
              ③  PHP只能单继承,不支持一个类继承多个类。但是一个类进行多层继承。
                class Person{};
                class ChengRen extends Person{};
                class Student extends ChengRen{};
                 //Student 类就同事具有了ChengRen类和Person的属性和方法。
     
      3、方法覆盖(方法重写)
              ① 子类继承父类;
              ② 子类重写父类已有方法。
             
              符合上述两个条件,称为方法覆盖。覆盖之后,子类调用方法,将调用子类的的方法。
     
              同样,除了方法覆盖,子类也可以具有与父类同名的属性,进行属性覆盖。
             
     
              如果,子类重写了父类方法,如何在子类中调用父类同名方法?
              partent:: 方法名();
             
              所以,当子类继承父类时,需在子类的构造中的第一步,首先调用父类构造进行辅助。
              function __construct($name,$sex,$school);
              partent::__construct($name,$sex);
              $this->school = $school;。
         
 class Person{
public $name;
public $sex; public function __construct($name,$sex){
$this->name=$name;
$this->sex=$sex;
} public function say(){
echo "我叫{$this->name},我是{$this->sex}生! <br> ";
}
} class Student extends Person{
public $school;
public function __construct($school){
$this->school=$school;
} public function say(){
parent::say();
echo "我叫{$this->name},我是{$this->sex}生! <br> ";
}
function say1(){
echo "今天下雨了,啦啦啦啦啦。<br>";
}
} $lalala = new Student("每天学习");
$lalala->name= "lalala";
$lalala->sex="不详";
$lalala->say();
$lalala->say1();

封装的一点演示代码

8  重点来了--php中的继承
    1、一个类,被多个子类继承。    
           如果,这个类的某个方法,在多个子类中,表现出不同的功能,我们称这种行为为多态。
        
          2、实现多态的必要途径;
              ① 子类继承父类;
              ② 子类重写父类方法;
              ③ 父类引用指向子类对象;
        
         
  abstract class Person{

             abstract function say();
function say1(){
echo "我是Say1";
}
}
class Chinese extends Person{
function say(){
echo "我是一个中国人<br>";
}
}
class English extends Person{
function say(){
echo "I'am a English";
}
} /*$a = new Chinese();
$a->say(); $b = new English();
$b->say(); */ function func(Person $p){
$p->say();
}

多态的一点演示代码

学习时候的笔记,可能会有一些错误的地方,欢迎各位的批评指点。

反思,复盘,每天收获一点---------------------期待更好的自己

*/美女镇楼/*>>>---PHP中的OOP-->面对过程与面对对象基础概念与内容--(封装、继承、多态)的更多相关文章

  1. OOP三大核心封装继承多态

    OOP支柱 3 个核心:封装 继承 多态 封装就是将实现细节隐藏起来,也起到了数据保护的作用. 继承就是基于已有类来创建新类可以继承基类的核心功能. 在继承中 另外一种代码重用是:包含/委托,这种重用 ...

  2. -1-2 java 面向对象基本概念 封装继承多态 变量 this super static 静态变量 匿名对象 值传递 初始化过程 代码块 final关键字 抽象类 接口 区别 多态 包 访问权限 内部类 匿名内部类 == 与 equal

    java是纯粹的面向对象的语言 也就是万事万物皆是对象 程序是对象的集合,他们通过发送消息来相互通信 每个对象都有自己的由其他的对象所构建的存储,也就是对象可以包含对象 每个对象都有它的类型  也就是 ...

  3. python基础语法15 面向对象2 继承,多态,继承json模块中JSONEncoder,并派生出新的功能

    继承 1.什么是继承? 继承是一种新建类的方式,新建的类称之为子类或派生类,继承的父类称之为基类或超类. - 在Python中,一个子类可以继承多个父类.(面试可能会问) - 在其它语言中,一个子类只 ...

  4. 封装继承多态(OOP)

    封装:把事物封装成类,私有化属性. 继承:共同的特性封装在父类,子类就有父类的属性 父类已经实现了的方法,子类也有需要前面+New 隐藏父类的方法,就不报错了,有这个语法,面试的时候问过,不推荐用. ...

  5. 第四课 OOP封装继承多态解析,接口抽象类选择 2019-04-21

    父类 xx = new 子类(); xx.method(); 1 普通方法由编译时决定(左边) --- 提高效率 2 虚方法(virtual)  由运行时决定-- -多态,灵活 3 抽象方法由运行时决 ...

  6. Python - 面对对象(基础)

    目录 Python - 面对对象(基础) 一. 概述 二. 创建类和对象 三. 面向对象三大特征 封装 继承 多态 Python - 面对对象(基础) 一. 概述 面向过程:根据业务逻辑从上到下写垒代 ...

  7. 不会JS中的OOP,你也太菜了吧!(第二篇)

    一.你必须知道的 1> 原型及原型链在继承中起到了关键的作用.所以你一定要理解他们.2> 不会JS中的OOP,你也太菜了吧!(第一篇) 二.继承的6种方法 1> 原型链继承 原型链继 ...

  8. Python进阶_面对对象&面对过程

    这节主要讲面对对象与面对过程两种编程思想的主要区别. 一. 简单对比 面向过程是一种基础的方法,它考虑的是实际的实现步骤,一般情况下,面向过程是自顶向下逐步求精,其最重要的是模块化的思想方法. 面向对 ...

  9. Java子父类中的构造函数实例化过程

    其实我们发现子类继承父类操作很简单,如果要是去深入的研究下会发现,实例化过程并非是我们看到的那样,我们就以代码举例来说明: 问大家,以下代码执行会输出什么呢? package com.oop; /** ...

随机推荐

  1. bzoj1898 [Zjoi2005]沼泽鳄鱼

    Description 潘塔纳尔沼泽地号称世界上最大的一块湿地,它地位于巴西中部马托格罗索州的南部地区.每当雨季来临,这里碧波荡漾.生机盎然,引来不少游客.为了让游玩更有情趣,人们在池塘的中央建设了几 ...

  2. 在Android Studio上测试运行,Unity发布成Android包的环境搭建步骤

      我用的是unity5.4.3版本,jdk是1.8.0_131版本,Android-SDK是r24.4.1版本,Android-NDK是r13b版本,作者是刚开始写博客,希望对在unity摸索的人有 ...

  3. IOS的UITableView

    UITableView 概述 UITableView 一般用来展示表格数据.可以滚动(继承自UIScrollView).性能极佳 UITableView分两种样式: Plain,不分组的样式 Grou ...

  4. ios模拟器bug

    Error: xcode-select: error: tool 'xcodebuild' requires Xcode, but active developer directory '/Libra ...

  5. JAVA-Socket通信笔记

    JAVA - Socket 从开学到现在 也学了三个月时间的java了,一直在 在 语法和基本使用上周旋,井底之娃一枚. 这两天 有学长指点,花了两天的时间 学习了java多线程和socket的简单使 ...

  6. Tomcat--各个目录详解(二)

    Tomcat整体目录: 一.bin文件(存放启动和关闭tomcat脚本) 其中.bat和.sh文件很多都是成对出现的,作用是一样的,一个是Windows的,一个是Linux. ① startup文件: ...

  7. 不依赖浏览器控制台的JavaScript断点调试方法

    随着浏览器的逐渐强大,绝大多数情况下的代码调试都是可以通过浏览器自带的一些调试工具进行解决.然而对于一些特殊情况仍然无法享受到浏览器的强大 调试能力,比如QQ客户端内嵌web的调试(虽然说QQ目前已经 ...

  8. SQL Server中INNER JOIN与子查询IN的性能测试

    这个月碰到几个人问我关于"SQL SERVER中INNER JOIN 与 IN两种写法的性能孰优孰劣?"这个问题.其实这个概括起来就是SQL Server中INNER JOIN与子 ...

  9. [转]Pig与Hive 概念性区别

    Pig是一种编程语言,它简化了Hadoop常见的工作任务.Pig可加载数据.表达转换数据以及存储最终结果.Pig内置的操作使得半结构化数据变得有意义(如日志文件).同时Pig可扩展使用Java中添加的 ...

  10. CentOS6.5下netcat工具安装教程

    1.下载下载地址:http://sourceforge.net/projects/netcat/files/netcat/0.7.1/下载的是netcat-0.7.1.tar.gz版本 2.拷贝用U盘 ...