面向对象-PHP面向对象的特性
1.类和公有化
class Computer {
//什么叫做类内,就是创建类的花括号内的范围叫做类内,其他地方则类外。 //public 是对字段的公有化,这个字段类外即可访问,赋值和取值 public $name = '联想'; } $computer = new Computer(); $computer -> name = 'Dell'; echo $computer->name; class Computer { private $name = '联想'; //这个时候我采用一个公共对外的方法来访问私有字段 //因为私有字段只能在类内访问,而对外的公共方法是类内的。 //更而公共方法又是公共的,所以类外又可访问。 public function run(){ //字段在类内调用的时候必须是类 -> 字段,而$_name只是一个普通变量而已。 //字段在类外调用的方法是对象 -> 字段,而类内就必须使用 Computer -> _name //但是在本类中,可以使用一个关键字来代替字来代替 Computer ,那就是 $this echo $this ->name; } } $computer = new Computer(); $computer -> run();class Computer {
private $name; private $model; private $cpu; private $keyboard; private $show; private $zb; //必须写个对外的入口,才可以取到 public function getName() { return $this->name; } //必须写一个对内的入口,对私有字段进行赋值 public function setName($name) { //这里的 $name 只是一个变量而已,参数而已 //$this->name 才是类的字段 $this->name = $name; } } $computer = new Computer (); echo $computer->getName(); //输出是空白的。
$computer->setName('Dell'); echo $computer->getName();//PHP有如下几个拦截器:
//1、__get($property)
//功能:访问未定义的属性时被调用在给不可访问属性赋值时
//2、__set($property, $value)
//功能:给未定义的属性设置赋值时被调用
//3、__isset($property)
//功能:对未定义的属性调用isset()时被调用
//4、__unset($property)
//功能:对未定义的属性调用unset()时被调用
//5、__call($method, $arg_array)
//功能:调用未定义的方法时被调用
//当类外的对象直接调用私有字段时,会报错。但可以先跟去检查是否有拦截器。如果直接对$name直接赋值,会先经过拦截器_set(),功能,未定义的属性被赋值时被调用。
__get()方法:这个方法用来获取私有成员属性值的,有一个参数,参数传入你要获取的成员属性的名称,返回获取的属性值。如果成员属性不封装成私有的,对象本身就不会去自动调用这个方法。
__set()方法:这个方法用来为私有成员属性设置值的,有两个参数,第一个参数为你要为设置值的属性名,第二个参数是要给属性设置的值,没有返回值。(key=>value)
class Computer { private $_name; private $_model; private $_cpu; //当类外的对象直接调用私有字段时,会跟着去检查是否有拦截器, //如果直接对 $_name 进行赋值,那么__set 方法就会拦截住,就不会报错了。 //采用拦截器进行赋值和取值 //赋值 private function __set($_key,$_value){ //采用$_key = '_name',那么 $_value = '联想'; //$this ->_name = '联想'; $this ->$_key = $_value; } //取值 private function __get($_key){ return $this -> $_key; //如果 $_key = '_name' 那么 $this -> _name; //如果 $_key = '_cpu' 那么 $this -> _cpu; //如果 $_key = '_model' 那么 $this -> _model; } } $computer = new Computer (); $computer->_name = '联想'; $computer->_cpu = '四核'; $computer->_model = 'i7'; echo $computer->_name;.//当我们调用对象$computer 未定义的属性_name时,没有定义这个属性时或者属性是私有字段,调用拦截器__get()方法 echo $computer->_cpu; echo $computer->_model;普通方法,存放类内,只有一份静态方法,也是存放于类内,只有一份区别在于:普通方法需要对象去调用,需要绑定$this 即,普通方法,必须要有对象,然后让对象来调用 而静态方法,不属于哪一个对象,因此不需要绑定$this 即,不需要对象也可以调用 使用的方式是: 类名::静态属性名 exp: echo human::$head;
class Human{ static public $head=1; public function easyeat(){ echo '普通方法<br />'; } static public function eat(){ echo '静态方法<br />'; } public function intro(){ echo $this->name; } } Human::eat(); /* 以下方法easyeat是一个非静态方法,就由对象来调用,但,用类来调用此方法来也可以执行,而严格状态下,此方法会执行,同时报错, */Human::easyeat(); /* 接上,从逻辑来理解,如果用类名静态调用非静态(普通)方法 比如:intro() 那么,这个$this是指哪个对象呢?? 因此会报错,因为找不到对象! Human::intro();/* 如上分析,其实,非静态方法,是不能由类名静态调用的,但目前,php中的面向对象检测不够严格,只要静态方法中没有$this关键字,就会转化成静态方法来处理! */$li=new Human(); $li->eat();/* 总结: 类》访问->静态方法(类的方法)->可以 Human::eat();
类》访问->普通方法(对象的方法)->不可以(虽然方法里不用$this关键字时,可以!但不支持这种写法)对象》访问》静态方法(类的方法)->可以
$li=new Human();
$li->eat();对象》访问》普通方法(对象的方法)->可以$li=new Human();
$li->easyeat();*/class Human{ static public $name = "小"; public $height = 180; static public function tell(){ echo self::$name;//静态方法调用静态属性,使用self关键词 //echo $this->height;//错。静态方法不能调用非静态属性//因为 $this代表实例化对象,而这里是类,不知道 $this 代表哪个对象 } public function say(){ echo self::$name . "我说话了"; //普通方法调用静态属性,同样使用self关键词 echo $this->height; }}$p1 = new Human();$p1->say(); $p1->tell();//对象可以访问静态方法echo $p1::$name;//对象访问静态属性。不能这么访问$p1->name//因为静态属性的内存位置不在对象里Human::say();//错。say()方法有$this时出错;没有$this时能出结果//但php5.4以上会提示(2)、静态方法不需要实例化即可调用。同上
(3)、静态方法不能调用非静态属性。因为非静态属性需要实例化后,存放在对象里;
(4)、静态方法可以调用非静态方法,使用 self 关键词。php里,一个方法被self:: 后,它就自动转变为静态方法;
class Computer {
public $_name = '联想'; public function _run(){ echo '联想在运行!'; } } class NoteComputer extends Computer { } } $noteComputer = new NoteComputer(); echo $noteComputer -> _name; $noteComputer -> _run(); 直接继承
//私有化,但是无法被子类继承,这个时候就应该用受保护的修饰符来封装
protected $_name = '联想';
protected function _run(){
return '联想在运行!';
}
}
class NoteComputer extends Computer {
public function getTop() {//私有化继承父类
echo $this->_name;
echo $this->_run();
}
}
$noteComputer = new NoteComputer();
$noteComputer -> _run();
面向对象-PHP面向对象的特性的更多相关文章
- 2、面向对象以及winform的简单运用(面向对象的四大基本特性)
面向对象的四大基本特性 面向对象的核心概念就是封装.抽象.继承.多态这四大基本特性,在这里先解释一下它们的定义: 封装:是一种隐藏信息的特性.找到变化并且把它封装起来,你就可以在不影响其它部分的情况下 ...
- C#基础知识之面向对象以及面向对象的三大特性
在C#基础知识之类和结构体中我详细记录了类.类成员.重载.重写.继承等知识总结.这里就记录一下对面向对象和面向对象三大特性的广义理解. 一.理解面向对象 类是面向对象编程的基本单元,面向对象思想其实就 ...
- Python面向对象学习2(面向对象的语法和特性,待更新)
上一个内容我们介绍了面向对象和面向对象场景现在我们来学习下语法和特性 1,面向对象基本语法: # -*- coding:utf-8 -*- # Author: Colin Yao class Dog( ...
- 牛客网Java刷题知识点之面向对象java的四大特性(抽象、封装、继承、多态)
不多说,直接上干货! 面向对象java的四大特性之抽象 抽象就是有点模糊的意思,还没确定好的意思. 就比如,要定义一个方法和类.但还没确定怎么去实现它的具体一点的子方法,那我就可以用抽象类或接口.具体 ...
- Python 基础 面向对象之二 三大特性
Python 基础 面向对象之二 三大特性 上一篇主要介绍了Python中,面向对象的类和对象的定义及实例的简单应用,本篇继续接着上篇来谈,在这一篇中我们重点要谈及的内容有:Python 类的成员.成 ...
- 什么是php面向对象及面向对象的三大特性
什么是面向对象? 面向对象编程,也就是我们常说的OOP,其实是面向对象的一部分.面向对象一共有3个部分:面向对象分析(OOA).面向对象设计(OOD).面向对象编程(OOP).我们现在将要学习的就是面 ...
- day31 Pyhton 面向对象的基础 三大特性
一.内容回顾 封装 1.概念 笔记 2.__名字 在类的外部就不能用了 3.私有化的 不能被子类继承,也不能在其他任何类中调用 三个装饰器方法(装饰类中的方法) 1.不被修饰的 普通方法,会使用对象 ...
- JS面向对象使用面向对象进行开发
面向对象基础一之初体验使用面向对象进行开发 对 JS 中的面向对象的基础进行讲述, 初体验使用面向对象进行开发 主要内容是 面向对象的概念及特性 用面向对象的方式解决简单的标签创建实例 一些基础的 ...
- Python面向对象学习 1 (什么是面向对象,面向对象的应用场景,待更新)
程序设计的三种基本结构: 面向对象,面向过程,函数式编程 1,什么是面向对象编程 面向对象编程是一种编程方式,此编程方式的落地需要使用 “类” 和 “对象” 来实现,所以,面向对象编程其实就 ...
- Python之面向对象:面向对象基础
一.面向过程.面向对象对比 1.面向过程 根据业务逻辑从上到下写垒代码 2.函数式思想 将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 3.面向对象 对函数进行分类和封装 1.2.3一步 ...
随机推荐
- 移动支付--银联,支付宝,微信(android)
在这个移动互联网快速发展的时代,手机已经成为人们生活或者出行之中必不可少的设备了,如今非常多城市的商户都能够採用支付宝,微信支付了.人们出门仅仅须要随身携带带手机.不用带大量现金就能够放心购物了.如今 ...
- (2.6)Mysql之SQL基础——存储引擎的查看与修改
(2.6)Mysql之SQL基础——存储引擎的查看与修改 可以使用 show engines; 查看数据库支持的所有的存储引擎: 目录: 1.数据库级别存储引擎 1.1查看现在默认的存储引擎 1.2 ...
- yum install mysql on centos 6.5 zz
http://www.cnblogs.com/xiaoluo501395377/archive/2013/04/07/3003278.html 1.使用yum命令进行mysql的安装 yum list ...
- 【MYSQL】主从常见问题运维
参见Mysql主从常见错误,http://hzcsky.blog.51cto.com/1560073/479476
- 20165324 《Java程序设计》 第六周
学号 2016-2017-2 <Java程序设计>第六周学习总结 教材学习内容总结 第八章 常用实用类 String类 构造String对象:常量对象:String对象:引用String常 ...
- RF是如何工作的?
随机森林的发展史 谈及随机森林算法的产生与发展,我们必须回溯到20世纪80年代.可以说,该算法是Leo Breiman, Adele Cutler, Ho Tin Kam, Dietterich, A ...
- 001-netty的优势
1.API简单. 2.性能高. 3.成熟稳定. 4.入门门槛低.
- webService 总结
Web Service基本概念 Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级的 ...
- Spring-1-I 233 Matrix(HDU 5015)解题报告及测试数据
233 Matrix Time Limit:5000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Descript ...
- Druid学习之路 (三)Druid的数据源和段
作者:Syn良子 出处:https://www.cnblogs.com/cssdongl/p/9703204.html 转载请注明出处 Druid的数据源和分段 Druid的数据存储在"Da ...