面向对象编程

类:在现实世界中,任何事物都有种类的概念:车

  类是由特征和行为构成的。

    特征:都是不动的,从出厂的时候就已经内置好了(属性)

    行为:一种动的状态。(方法(函数))

  行为依赖于这些特征,而特征只有通过这些行为才能施展。

对象调用属性、方法

<?php
header("Content-Type:text/html; charset=utf-8"); class Persion{
const NAME = "小王";
public $name = "小明"; //public访问控制符
public $name1 = "小红"; public function run($my_nume){
echo $my_nume;
} } //对象调用属性 以及方法 使用->
//对象调用属性的时候,直接加属性名,不要加$符
//对象调用方法的时候,直接写方法名就可以了
//调用类常量,可以用当前对象,加::的形式来调用 $p = new Persion(); //返回的是一个对象 echo $p->name; $p->run("小蓝"); echo $p::NAME;
echo Persion::NAME; //也通过直接调用当前类 加::的形式来调用

类常量:const

  const用于类成员常量的定义,一经定义,不可修改。

  const和define的区别:

    1、const可以在类中使用,define不能

    2、const不能在条件语句中定义常量

    ☆ const定义的常量是大小写敏感,而define可以通第三个参数来指定大小写是否敏感。

构造函数:__construct()

  我们在创建一个类的时候有时候需要初始化一些操作,这个时候我们需要使用初始化函数,在PHP中有两种初始化方法:

  1、构造函数:__construct() 。注意:构造函数是自动运行的,在你实例化的时候就自动执行了。

class MyPc
{
function __construct(){
//初始化操作
}
}
new MyPc();

构造函数怎么传递参数呢?通过在类名实例化的小括号里传递我们的参数:

class MyPc{

    function __construct($name)
{
echo '你好'.$name;
}
} new MyPc("小王");

  2、建立一个对象方法

注意:此时测方法名没有大小写区分,只要与类名一致,均会被当成构造函数,在实例化时自动调用。

class MyPc
{
function MyPc(){    //当方法名跟我们的类名一致的时候,PHP就会自动的把它当成构造函数来使用
echo "123";
}
} new MyPc();

注意:

__construct的优先级比对象方法高,当类中有__construct时必须放在类的开头。

class MyPc{

    function __construct($name)
{
//如果用__construct方法,则必须放在类中的开头
echo '你好'.$name;
} function MyPc()
{
//此时的MyPc()方法就是一个普通的方法
echo "asd";
}
} (new MyPc("小王"))->MyPc();
//此时要实例化类,则必须传入一个参数,因为构造函数定义的时候需要一个参数,之后由于没有定义一个参数来赋值类,所以用括号扩起来。

析构函数:__destruct()    了解就好

  能够在对象释放时自动被调用的方法被称为析构函数。

理解:  

  我们可以理解为垃圾回收机制,当对象内部的操作执行完毕的时候,__destruct()被调用,然后对象所使用的内存被释放出来。

规则:

  先进先出

$this 关键字

  $this关键字:是用来访问当前对象中的对象属性和对象方法的系统变量

理解:

  我们可以理解为$this是在对象中特殊的一种使用构造函数和变量的方法。

  注意:$this仅能在当前对象中使用

class Pc{
public $name = "小马"; function computer($name='小明',$c='')
{ $this->name = $name;
//可以动态的修改类的属性,第一个name不加$,表示类的属性
//第二个是传入的参数
echo $this->name;
//在类的里面,调用其他属性和方法用$this
//用$this加->调用属性和方法
//注意,这里的name不用加$符号
} } //类不被实例化,是不会展示类里面所有功能的。
$p = new Pc();
$p->computer();
//这里没有传递参数,则定义时必须给形参一个默认值

类成员的访问控制

访问控制符:

  就是把一些相关的属性和行为隐藏起来,从而得到保护和安全。

public:

  表示全局,在类的内部和外部子类都可以访问。

protected:

  表示受保护的,只有本类或子类或父类中使用。

private:

  表示私有,只有本类内部可以使用。

☆ 类,是要被实例化返回一个对象的,在对象访问的时候,访问属性和方法只能用public来访问,不能用其他两个。即无法用->来访问proteced和private的属性和方法。

class Pc{
public $name = "小马"; protected $age = '18';
//受保护的,在本类中可以使用$this->来调用,但是在外部实例化的时候是不能调用的
//可继承
private $city = '上海';
public function test()
{
return $this->name."在".$this->city;
//方法最好有返回值热,retur和echo都可以,建议用return
//$this 调用本类的属性和方法
} } //类的外面想要调用属性,要先实例化该类
$p = new Pc();
/*echo $p->name; //正常调用
echo $p->age; //Fatal error: Cannot access protected property
echo $p->city; //Fatal error: Cannot access private property */
echo $p->test();

类的自动加载:__autoload()

  使用"__"开头的基本上都是系统的构造函数

作用:  

  快速取得对象名称并自动载入进当前页面,当实例化类的时候,会自动获取类的名称,并在当前文件中及当前文件目录下自动加载

<?php
header("Content-Type:text/html; charset=utf-8"); //类的自动加载
//自动加载函数,可以放到类的外面,执行该文件的时候会自动执行
function __autoload($class_name){
include($class_name.".php");
//如果本文件中没有这个类,那么会在本文件目录下自动加载以该类名称命名的文件
} $p = new Pc();
echo $p->name;
#$p = new MyPc(); //如果本文件中没有这个类,那么会在本文件目录下自动加载以该类名称命名的文件
class Pc
{
public $name = "adf";
}

类的继承:extends

  PHP类的继承,我们可以理解成共享被继承类的内容。PHP中使用extends单一继承的方法,请切记:(非C++多继承)被继承的类我们叫做父类(基类),继承者称为子类(派生类)。

PHP继承的规则:

  可多重继承,但是不能同时继承多个。可避免属性和方法的重名。

关键字:parent

  子类(派生类)继承父类(基类)。子类想访问跟子类方法同名的父类的时候,并且子类的方法也不想被方法重载的时候。这时候使用parent。

  在类中定义方法的时候,如果不写访问控制符,那么默认是public属性。

//基类、父类
class A
{
function test(){
echo "父类";
}
} class B extends A
{
function test()
{
#echo "子类";
parent::test();
}
} $p = new B();
$p->test();
//如果子类中的方法名与父类中的方法名重复,那么子类的方法会覆盖父类中的方法。(方法的重载)

当子类和父类的方法重名的时候,由于直接调用方法会默认调用子类的方法,因此我们使用parent关键字来调用父类中的方法。(在子类中使用)

方法重载

  基类方法重载:

    因为属于向下继承的原理,基类不能使用派生类里的内容,这时基类的一些方法不能完成我们的一些派生类的功能。

    我们就可以进行方法重载,避免新建方法带来的混乱。

  理解:方法重载我们也可以理解为方法覆盖,在派生类中使用与基类方法重名的方法名来执行重载。

例子与上面parent一样。

范围操作符: "::"

  注意:这个符号用于类中(而不是对象中)访问成员,对象访问成员使用的是"->"符号。

  使用场景:

    1、在使用类的时候,父类和子类具有相同的属性和方法时,利用它可以避免混淆。

    2、在类外的时候,没有创建对象的情况下使用该操作符访问类的成员。

  记住:

    在多数情况下,我们使用范围解析操作符是为了访问被重写的方法。我们也可以用其访问静态和常数成员。

//基类、父类
class A
{
const Name='小明';
public static function test()
{
echo "静态方法";
} public function aa()
{ }
} //调取类常量
echo A::Name;
A::test();
//加::来调用一些静态的属性和方法
A::aa();
//不可以调用普通的方法名,Non-static method A::aa() should not be called statically

注意:不允许直接调用普通方法。

  

静态成员的作用

  静态:只要在成员前加上关键字static,该变量就成为静态成员了。

  1、静态变量属于类,而不属于类的某个实例。这个变量对所有实例都有效。

  2、声明为static的类、函数和变量将不能引用实例方法或变量。

  3、静态变量和方法必须通过类名进行引用而不能通过实例对象引用。

//基类、父类
class A
{
public static function test()
{
echo "这是一个普通方法";
}
} //调用静态的,无论是方法还是属性,都可以用::
A::test();

匿名类    (了解即可,PHP7新加入的)

  PHP7支持通过new class来实例化一个匿名类,这可以用来替代一些“用后即焚”的完整类定义。

trait技术

  Traits是一种为类似PHP的单继承语言而准备的代码复用机制。Trait为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用方法集。

  作用:我们在没有增加代码复杂的情况下,实现了代码的复用。  

  trait类可以理解为复制粘贴类,由trait关键字定义,用use关键字调用(粘贴)。

//基类、父类
trait Pc
{
public function usb()
{
echo "usb";
} function key()
{
echo "key";
}
}
//trati类、复制粘贴类
class A
{
use Pc; } $a = new A();
$a->key();

问题:trait类和继承类有什么区别 ???

抽象类:abstract(类似纯虚函数,纯虚函数的定义是在虚函数定义的基础上,再让函数等于0即可)

  抽象就是无法确切的说明,但又有一定的概念或者名称,在PHP中声明一个抽象类或者方法我们需要使用abstract关键字。

定义:

  一个类中至少有一个方法是抽象的,我们称之为抽象类。所以如果定义抽象类首先定义抽象方法。

总结:

  1、类中至少有一个抽象方法,可以有其他普通方法。

  2、抽象方法不允许有{ },即不能有方法体。

  3、抽象方法前面必须加abstract。

几个特点:

  1、不能被实例化,只能被继承。

  2、继承的派生类当中要把所有的抽象方法重载才能实例化。

abstract class A
{
abstract function usb(); function test(){ }
} #new A();
//抽象类不能被实例化
//Cannot instantiate abstract class A class B extends A{
function usb(){
echo "子类重载";
}
//如果没有重载抽象类中的所有抽象方法,会出现以下报错
//Class B contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (A::useb)
} $b = new b();
$b->usb();

  ☆派生类里面必须实现抽象类里面的所有方法,少了一个都不行。

 接口:interface(类似C++的抽象类,但是C++抽象类的定义是:包含由纯虚函数的类被称为抽象类)

  接口:一种成员属性全部为抽象的特殊抽象类,在程序中同为规范的作用。

  

接口的引用:

  接口引用区别之前我们学的继承关键字extends,继承只能是单一性,而接口可以使用关键字:implement引用多个引用并用逗号“,”分开。

interface Pc
{
//接口类的所有方法都是抽象方法
//所有抽象方法都必须是public属性,默认是publi。
function key();
function usb($name); } interface person{
public function age();
public function name($p_name);
}
//接口类只允许被实现和引用
//接口允许多引用,然后用“,”分开就行
class B implements Pc,person
{
//如果要实现接口类,要把接口类里面的所有抽象方法都给实现
//少一个都不行
function key(){ }
function usb($name){
echo "这是一个参数".$name;
}
function age(){
echo "18";
}
function name($p_name){
echo "名字是:".$p_name;
}
}
$b = new B();
#b->usb("鼠标");
$b->age();
$b->name("小红");

关键字:self:

  self用来访问当前类的内容的关键字,类似于$this关键字,但$this是需要类实例化以后才可以使用,self可以直接访问当前类中的内部成员。

  注意:

    因为没有实例化类访问内部属性或者方法是没有意义的,

    所以self一般用来访问类中的:静态成员,常量,或者其他定义内容。

关键字:final

  final是用来定义类和方法的一个重要关键字,当定义类的时候该类将不能被继承,当用来定义方法的时候该方法将不能被重载。

//使用final关键字,A类将不被任何类继承
#final class A
class A
{
public $name = "小明"; //如果不想父类的方法被重写,使用final关键字
final public function test(){
echo "父类";
}
} //此时B类继承A类将会报错:Class B may not inherit from final class (A)
class B extends A
{
//此时父类方法使用final关键字,子类就不能再进行重载了,会报错:Cannot override final method A::test()
public function test()
{
echo $this->name;
}
} $a = new B();
$a->test();

对象复制与克隆

  产生背景:

    有时候我们需要在一个项目里面使用两个或多个一样的对象,如果使用new关键字重新创建对象,再赋值上相同的属性,这样做比较繁琐而且也容易出错,PHP提供了对象克隆功能,可以根据一个对象完全克隆出一个一模一样的对象,而且克隆以后,两个对象互不干扰。

关键字:clone

  $克隆对象名称 = clone $原对象名称;

  克隆一个跟$原对象名称一模一样的一个对象。

__clone()

  如果想在克隆后改变原对象的内容,需要在类中添加一个特殊的__clone()方法来重写原本的属性和方法。__clone()方法只会在对象呗克隆的时候自动调用。

☆☆

MySQLoi基本操作1

  1、面向过程:

     我们用mysqli_connect()函数建立一个连接。然后选择数据库,然后发送SQL指令,最后释放资源。

  2、面向对象:

    new新建一个mysqli对象,传入数据库连接的相关参数就可以获得一个mysqli对象。可以通过$mysqli->connect_errno判断连接是否有误。

<?php
$mysqli = new mysqli("localhost","root","123qwe");
$mysqli->select_db("test");
$mysqli->set_charset("utf8"); $mysqli_result = $mysqli->query("select * from admin");
$result = $mysqli_result->fetch_all();
var_dump($result);
$mysqli_result->close(); $mysqli->close();

MySQLoi基本操作2

查询:

  面向对象执行操作也有4中。分别为查询、新增、更新、删除。

  //查询:

    $result = $link->query('select * from user');

  //获得结果集中行的数目:

    $num_rows = $result->num_rows.'<br/>';

Mysqli基本操作3

结果集:

  执行$mysqli->query();

  返回一个结果集。

  想要从结果集中取出数据,可以用$mysqli_result->要求返回的形式。

<?php
header("Content-Type:text/html; charset=utf-8"); //连接数据库
$link = new mysqli('localhost','root','123qwe','test'); //设置字符集
$link->set_charset('utf8');
$sql = 'select * from user'; //返回一个结果集
$link_result = $link->query($sql); //取出结果集
$resulut = $link_result->fetch_assoc();
#$resulut = $link_result->fetch_row();
#$resulut = $link_result->fetch_array();
var_dump($resulut); //释放结果集
$link_result->close(); //关闭资源
$link->close();

---------------------------------------------------------------------------------------------------------

哪几种形式:

  fetch_assoc()

    查询到的一条数据以关联数组的形式返回

  

---------------------------------------------------------------------------------------------------------

  fetch_row()

    查询到的一条数据以索引数组的形式返回

  

--------------------------------------------------------------------------------------------------------

  fetch_array()

    查询到的一条数据以索引数组和关联数组的混合形式返回

  

---------------------------------------------------------------------------------------------------------

  fetch_all()

    查询到的所有数据以索引数组的形式返回

  

 魔术方法:__get

  __get(string $name)

    在读取不可访问的属性的值时该函数会被调用。$name是属性名。

class Demo
{
private $age= 18;
public $name; //当你访问不存在的或者权限不够的时候
function __get($name){
if($this->name == 'admin'){
return $this->$name;
}else{
return "数据出错";
} } } $a = new Demo();
$a->name='admin';
echo $a->age;
//此时__get()的参数$name为age

 魔术方法:__set

    __set(string $name,mixed $val)

       设置不可访问的值时会调用该方法

class Demo
{
private $age;
public $name; //当你设置不存在的或者权限不够的属性时,自动调用该方法
//起到一层过滤作用,一种安全机制
function __set($name,$val){
if($this->name == 'admin'){
echo $this->$name=$val; }else{
echo "权限不够";
}
} } $a = new Demo();
$a->name = 'admin';
$a->age=18; //此时__set()的参数$name为age,$val为18

 魔术方法:__toString

    __toString:

      尝试直接访问一个实例化出来的对象时会调用该方法。

class A
{
//此魔术方法要求必须有返回值。且只能用return
function __toString(){
return "";
//如果使用echo,会出现以下报错
//Catchable fatal error: Method A::__toString() must return a string value
}
}
//当你尝试直接输出对象的时候会自动调用
$a = new A();
echo $a;
//如果类A中没有任何内容,直接输出会报错
//Catchable fatal error: Object of class A could not be converted to string

 魔术方法:__sleep

  serivaliza()函数(序列化函数)会检查类中是否存在魔术方法__sleep(),如果存在,该方法会先被调用,然后才执行序列化操作。

  作用:

    此功能可以用于清理对象,并返回一个包含对象中所有应该被序列化的变量名称的数组。

    如果该方法会返回任何内容,则NULL被序列化,并产生E_NOTICE级别的警告错误。

  做什么:

    __sleep()常用作提交未提交的数据,或类似的数据清理工作。同时,如果有一些很大的对象,担不需要保存全部信息

魔术方法:__wakeup

    与上面的__sleep()相反,unserivalize()函数(反序列函数)会检查是否存在一个__wakeup()方法,如存在则先调用该方法,预先准备对象。

笨鸟先飞早入林,笨人勤学早成材。

转载请注明出处:
撰写人:fox-yu http://www.cnblogs.com/fox-yu/

【编程开发】PHP---面向对象的更多相关文章

  1. Java面向对象编程 第一章 面向对象开发方法概述

    一.软件开发经历的生命周期: ①软件分析 ②软件设计 ③软件编码 ④ 软件测试 ⑤ 软件部署 ⑥软件维护 二.为了提高软件开发效率,降低软件开发成本,一个优良的软件系统应该具备以下特点: ① 可重用性 ...

  2. Python全栈开发【面向对象】

    Python全栈开发[面向对象] 本节内容: 三大编程范式 面向对象设计与面向对象编程 类和对象 静态属性.类方法.静态方法 类组合 继承 多态 封装 三大编程范式 三大编程范式: 1.面向过程编程 ...

  3. C++编程开发学习的50条建议(转)

    每个从事C++开发的朋友相信都能给后来者一些建议,但是真正为此进行大致总结的很少.本文就给出了网上流传的对C++编程开发学习的50条建议,总结的还是相当不错的,编程学习者(不仅限于C++学习者)如果真 ...

  4. 【转】50条大牛C++编程开发学习建议

    每个从事C++开发的朋友相信都能给后来者一些建议,但是真正为此进行大致总结的很少.本文就给出了网上流传的对C++编程开发学习的50条建议,总结的还是相当不错的,编程学习者(不仅限于C++学习者)如果真 ...

  5. Python自学编程开发路线图(文中有免费资源)

    Python核心编程 免费视频资源<Python入门教程>:http://yun.itheima.com/course/145.html Python 基础学习大纲 所处阶段 主讲内容 技 ...

  6. IT视频课程集(包含各类Oracle、DB2、Linux、Mysql、Nosql、Hadoop、BI、云计算、编程开发、网络、大数据、虚拟化

    马哥Linux培训视频课程:http://pan.baidu.com/s/1pJwk7dp Oracle.大数据系列课程:http://pan.baidu.com/s/1bnng3yZ 天善智能BI培 ...

  7. 50条大牛C++编程开发学习建议

    每个从事C++开发的朋友相信都能给后来者一些建议,但是真正为此进行大致总结的很少.本文就给出了网上流传的对C++编程开发学习的50条建议,总结的还是相当不错的,编程学习者(不仅限于C++学习者)如果真 ...

  8. 前端开发:面向对象与javascript中的面向对象实现(二)构造函数与原型

    前端开发:面向对象与javascript中的面向对象实现(二)构造函数与原型 前言(题外话): 有人说拖延症是一个绝症,哎呀治不好了.先不说这是一个每个人都多多少少会有的,也不管它究竟对生活有多么大的 ...

  9. 前端开发:面向对象与javascript中的面向对象实现(一)

    前端开发:面向对象与javascript中的面向对象实现(一) 前言: 人生在世,这找不到对象是万万不行的.咱们生活中,找不到对象要挨骂,代码里也一样.朋友问我说:“嘿,在干嘛呢......”,我:“ ...

  10. Python全栈开发【面向对象进阶】

    Python全栈开发[面向对象进阶] 本节内容: isinstance(obj,cls)和issubclass(sub,super) 反射 __setattr__,__delattr__,__geta ...

随机推荐

  1. [SCOI2007]降雨量

    ST表,再大力讨论一下(因为lower_bound和upper_bound,WA了一次) # include <bits/stdc++.h> # define RG register # ...

  2. STM32高级定时器TIM1产生两路互补的PWM波(带死区)

    测试环境:Keil 5.20.0.0 STM32F103RBT6 固件库版本:STM32F10x_StdPeriph_Lib_V3.5.0(2011) 本文使用TIM1的通道1,通道2,产生两路1kh ...

  3. PHP Curl会话请求

    /** * @param string $url 请求地址 * @param string $type 请求类型 post get * @param string $arr 如果是post 传递的数据 ...

  4. scrapy 爬虫基础

    Scrapy是Python开发的一个快速.高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据.Scrapy用途广泛,可以用于数据挖掘.监测和自动化测试. 安装Scrapy的 ...

  5. NancyFX 第十二章 通道截拦

    所有的好的Web框架都有一套好的通道截拦的机制,Nancy在我看来是处理最好的.那什么是请求通道那?下面的图可能说的比较清楚些: 正如名称中描述的,一个典型的Web请求在到达最终响应前会穿过一定数量的 ...

  6. NOI2001炮兵阵地

    题目传送门 PS:本道题目建议在对状压dp有一定了解的基础下学习,如有不懂可以先去学一下状压dp入门 题目大意:给你n*m个格子,有些格子可以用来部署军队,用P表示,有些则不能,用H表示,如果在一个格 ...

  7. 审核Memcrashed Drdos攻击代码

    0x00前言: 距离世界上最大的Drdos攻击已经过去了两个星期左右 昨天在交流的时候.群友在Github中找到了exploit. 0x01开始: #-- coding: utf8 -- #!/usr ...

  8. Unity3D 心跳检测

    在B/S结构的项目开发的过程当中 在服务端与客户端正常的通信之外 服务端通常还需要知道客户端是否还处于连接状态 或者客户端也需要知道服务端是否还处在开启状态 大白话说完了,听一下比较正统的解释吧(摘自 ...

  9. 十倍效能提升——Web 基础研发体系的建立

    1 导读 web 基础研发体系指的是, web 研发中一线工程师所直接操作的技术.工具,以及所属组织架构的总和.在过去提升企业研发效能的讨论中,围绕的主题基本都是——”通过云计算.云存储等方式将底层核 ...

  10. kafka概念使用简介注意点

    使用场景 大数据量.低并发.高可用.订阅消费场景 概念理解 分区个数与消费者个数 分区个数 = 消费者个数 :最合适状态 分区个数 > 消费者个数 :某些消费者要承担更多的分区数据消费 分区个数 ...