PHP 面向对象
封装与不封装的区别: 未封装 时 外部随意更改数据 数据 不需要判定 就可以执行 外部直接操作数据
封装: 外部同样可以对数据更改,但需要 调用 类里面的 函数 外部间接操作数据 (间接调用并且 内部进行判定后方可执行)
原则上成员变量 私有 成员函数公有
类 : 成员变量 成员属性 成员方法
面向对象的三大特性: 封装 继承 多态
封装作用: 使数据更加安全
封装的方法: 1.首先使变量私有 private 2. 类里面做方法 间接访问 成员变量 3.方法里面加控制(
在方法里面加控制(仿制外界随便用){赋值和取值 分别为两个方法(函数)return注意}
)
------------------------------------------------------------------------------------------------------------------
例题
return 应用 封装 : 1. 私有 private 2. 类里面构造方法 间接访问 成员变量
1.以下两个例题 注意 构造函数 的区别(两种方法)
封装:
class people
{
private $name;
private $sex;
private $age;
function __construct($a,$b,$c)
{
$this->name=$a;
$this->age=$b;
$this->sex=$c;
}
private function leftLeg()
{
return "迈左腿";
}
private function RightLeg()
{
return "迈右腿";
}
function run()
{
echo $this->name."在走路".$this->leftLeg().$this->RightLeg(); } } $paobu=new people("黄牛",19,"男");
$paobu->run() 输出结果:黄牛在走路迈左腿迈右腿
私有函数 private 应用
class people
{
private $name;
private $sex;
private $age;
function __construct($a="黄牛2",$b="19",$c="男")
{
$this->name=$a;
$this->age=$b;
$this->sex=$c;
}
private function leftLeg()
{
return "迈左腿";
}
private function RightLeg()
{
return "迈右腿";
}
function run()
{
echo $this->name."在走路".$this->leftLeg().$this->RightLeg(); } } $paobu=new people();//注意构造函数
$paobu->run()
注意构造函数和 上面例题的区别
2.封装方法1 转化为私有 2. 类里面构建方法 外部 通过方法对 变量进行 获取或者 赋值 (构建两个方法)
class ren
{
private $name;
private $age;
private $nation; function __construct($a,$c)
{
$this->name=$a; $this->nation=$c; }
//创建方法 用于修改年龄(在外界)
function set($ll)
{
//加控制是否满足条件
if( $ll>10&&$ll<50)
{
$this->age=$ll;
echo "我叫".$this->name."今年".$this->age."岁".$this->nation; }
}
//创建方法来用 于取值 获取
function get()
{
return $this->age;
} } $renmen=new ren("张","汉族");
$renmen->set(20);
echo $renmen->get(); //获取年龄
方法1 类里面构建两个方法
封装 方法二: 常用(重要)__set($a,$b) 方法 和__get($p) 方法 详见下面例题 注意写参数 {该方法只写在类里面} 使用时 默认自动调用 其他书写和非封装书写方式一样
魔术方法内部不需要返回值 $this->name="名字"; 这里的那么需要手写不提示
class Ren
{
public $code; //人员代号
private $name; //人员名称
private $sex; //人员性别
private $age; //人员年龄,必须在18-50周岁之间 //构造方法,用来初始化性别
function __construct($s)
{
$this->sex = $s;
}
function __set($n,$v)//前面是 名称 后面是 值
{
if($n=="age")
{
if($v>18 && $v<50)
{
$this->$n = $v;
}
}
else
{
$this->$n = $v;
} } //__get魔术方法,用来取变量值的
function __get($n)
{
return $this->$n;
}
} //造对象
$r = new Ren("男");
$r->age = 30; //自动调用__set()方法,将变量名当做第一个参数,将等号右边的值当做第二个参数
$r->name = "张三";
echo $r->sex; //自动调用__get()方法,将变量名当做参数
var_dump($r);
----------------------------------------------结果
男
object(Ren)[1]
public 'code' => null
private 'name' => string '张三' (length=6)
private 'sex' => string '男' (length=3)
private 'age' => int 30
方法二: 调用魔术方法 写入魔术方法后 以后自动调用(代码和为封装一样使用)
3.返回 类名 连续 (说不明白直接看例题)
class Dog
{
private $name; function Jiao()
{
echo $this->name."在叫";
} function SetName($n)
{
$this->name = $n;
return $this;// 注意这里
} } $d = new Dog();
$d->SetName("旺财")->Jiao()//注意这里
例题(重要)
继承:
1.父类
2.子类
子类可以继承父类的一切(有的时候需要自己亲自打上 并不提示 如下面 注释处)
如果子类对父类的方法进行重写 但是 在子类中还需要 父类的方法 使用 parent ::say() 详细如下
重写:override
特点:单继承,一个子类只能有一个父类,一个父类可以派生多个子类
class Ren
{
public $name; function Say()
{
echo $this->name."正在讲话";
}
} class China extends Ren// extends
{
//子类对父类的方法进行重写
function Say()
{
parent::Say();
/*子类中调用父类的成员 parent ::say();在子类中使用 父类的 say 方法*/
echo "你好";
} function Run()
{
echo $this->name."正在跑步";//
}
} class America extends Ren
{
//子类对父类的方法进行重写
function Say()
{
echo "hello";
}
}
$c = new China();
$c->Say(); //输出 正在讲话 你好
$a = new America();
$a->Say(); //hello
var_dump($c);
多态:
3.多态(以下是对强类型语言中讲解多态 弱类型语言 几乎看不出来)
当父类引用指向子类实例的时候,由于子类对父类的方法进行了重写,父类引用在调用该方法的时候表现出的不同,称为多态
运行多态
条件
1.要有继承
2.父类引用指向子类实例
3.要有重写
4.调重写的方法
关键词 重写:override
overload(重载)(多态的一种,编译多态)
当父类引用指向子类实例的时候, 由于子类对父类的的方法进行了重写,父类引用在调用该方法的时候表现出的不同
可以使 类里面的某个方法产生多种效果, 根据传入参数的不同, 可以执行不同的逻辑 例如: rand() 根据传入不同值而产生不同的效果
//3.多态
//当父类引用指向子类实例的时候,由于子类对父类的方法进行了重写,父类引用在调用该方法的时候表现出的不同,称为多态
//运行多态 //条件
//1.要有继承
//2.父类引用指向子类实例
//3.要有重写
//4.调重写的方法 //父类
/* class Ren
{
public virtual string Say()
{
return "说话";
}
} //子类
class China : Ren
{
public override string Say()
{
return "你好";
}
}
//子类
class America : Ren
{
public override string Say()
{
return "hello";
}
} //父类引用r指向子类实例
Ren r = new America();
MessageBox.Show(r.Say()); r = new China();
MessageBox.Show(r.Say()); //子类的对象可以代替父类的对象
America a = new America();
MessageBox.Show(Eat(a));
//怪兽吃人,需要一个人的参数
public string Eat(Ren r)
{
return "这个人味道不错!";
}
多态(强类型语言)
overload 重载
可以使类里面的某个方法产生多种效果,根据传入的参数不同,可以执行不同的逻辑
也是多态的一种,编译多态
class Test
{
public string show()
{
return "0参";
}
public string show(string s)
{
return "1参";
}
public string show(string s,string a)
{
return "2参";
}
} Test t = new Test(); t.show("a","b");
onload重载(强类型语言)
<?php
class ren
{
private $name;
private $age;
private $nation; function __construct($a,$b,$c)
{
$this->name=$a;
$this->age=$b;
$this->nation=$c; }
function shu()
{ return "我叫".$this->name."今年".$this->age."岁".$this->nation;
}
} $renmen=new ren("张",18,"汉族");
echo $renmen->shu();
?>
输出拼接字符串
PHP 面向对象的更多相关文章
- angular2系列教程(六)两种pipe:函数式编程与面向对象编程
今天,我们要讲的是angualr2的pipe这个知识点. 例子
- 一起学 Java(二)面向对象
一.方法函数 函数也称为方法,就是定义在类中的具有特定功能的一段独立代码.用于定义功能,提高代码的复用性. 函数的特点1> 定义函数可以将功能代码进行封装,便于对该功能进行复用:2> 函数 ...
- js面向对象学习 - 对象概念及创建对象
原文地址:js面向对象学习笔记 一.对象概念 对象是什么?对象是“无序属性的集合,其属性可以包括基本值,对象或者函数”.也就是一组名值对的无序集合. 对象的特性(不可直接访问),也就是属性包含两种,数 ...
- 前端开发:面向对象与javascript中的面向对象实现(二)构造函数与原型
前端开发:面向对象与javascript中的面向对象实现(二)构造函数与原型 前言(题外话): 有人说拖延症是一个绝症,哎呀治不好了.先不说这是一个每个人都多多少少会有的,也不管它究竟对生活有多么大的 ...
- .NET 基础 一步步 一幕幕[面向对象之对象和类]
对象和类 本篇正式进入面向对象的知识点简述: 何为对象,佛曰:一花一世界,一木一浮生,一草一天堂,一叶一如来,一砂一极乐,一方一净土,一笑一尘缘,一念一清静.可见"万物皆对象". ...
- 简单分析JavaScript中的面向对象
初学JavaScript的时候有人会认为JavaScript不是一门面向对象的语言,因为JS是没有类的概念的,但是这并不代表JavaScript没有对象的存在,而且JavaScript也提供了其它的方 ...
- Java程序员应该了解的10个面向对象设计原则
面向对象设计原则: 是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton.Decorat ...
- JavaScript学习笔记(三)——this、原型、javascript面向对象
一.this 在JavaScript中this表示:谁调用它,this就是谁. JavaScript是由对象组成的,一切皆为对象,万物皆为对象.this是一个动态的对象,根据调用的对象不同而发生变化, ...
- 带你一分钟理解闭包--js面向对象编程
上一篇<简单粗暴地理解js原型链--js面向对象编程>没想到能攒到这么多赞,实属意外.分享是个好事情,尤其是分享自己的学习感悟.所以网上关于原型链.闭包.作用域等文章多如牛毛,很多文章写得 ...
- .NET基础拾遗(2)面向对象的实现和异常的处理基础
Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开 ...
随机推荐
- CBOW and Skip-gram model
转自:https://iksinc.wordpress.com/tag/continuous-bag-of-words-cbow/ 清晰易懂. Vector space model is well k ...
- html,body的关系
先上一张关系图 最底下的一个是画布,往上一层是html结构,再往上一层是body结构 默认情况下html,body的height都是0,你给这两个元素分别加个边框就能看出来,要特别注意的是加背景颜色是 ...
- Oracle11g字符集AL32UTF8修改为ZHS16GBK详解【转】
------感谢作者,确实解决了问题.分享下,希望帮到更多人 此问题发生在数据库迁移过程中.源数据库:自己笔记本上win7 64位系统的oracle11g个人版,字符集ZHS16GBK :目标数据库, ...
- Sphinx在windows上的安装使用
Sphinx是一个基于SQL的全文检索引擎,可以结合MySQL,PostgreSQL做全文搜索, 它可以提供比数据库本身更专业的搜索功能,使得应用程序更容易实现专业化的全文检索. Sphinx特别为一 ...
- python word
代码: #coding=utf-8 __author__ = 'zhm' from win32com import client as wc import os import time import ...
- 关于line-height
line-height不允许负值,给定值之后会根据font-size计算行高,line-height指定的行高是行高最小值,设置height可以增大行高 line-height的计算:以px为例,li ...
- linux重定向
常用FD有3个,为0(stdin,标准输入).1(stdout,标准输出).2(stderr,标准错误输出),默认与keyboard.monitor有关: cmd > file 把 stdout ...
- linux之svn
sudo apt-get install subversion 实践出真理
- ionic 界面数据缓存问题
在ionic开发过程中列表到详情,在返回是可能存在,列表重新加载问题,不能回到用户上次点击的地方 在处理前期各种坑,把详情设置为弹出层,缓存数据等等,然而会出现各种问题,无意间发现一篇文章,一个属性解 ...
- 11月8日上午Jquery的基础语法、选取元素、操作元素、加事件、挂事件及移除事件
jquery基础知识 1.jquery文件的引入,所有的js代码要写在下面那段代码下面. <script src="../jquery-1.11.2.min.js">& ...