面向对象-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一步 ...
随机推荐
- Linux进入-adsdfsd目录
Linux进入-adsdfsd目录 如果某个目录名称是短线(短横线)开头的 要想在命令行中进入目录,使用如下命令: cd -- -adsdfsd 延伸: 其他非寻常操作: http://www.cnb ...
- 【开发者笔记】归并排序过程呈现之java内置GUI表示
在网上看到一个视频将各种排序用视频表示出来,配上音乐,挺好玩的样子,就算是不会编程的人看到也会觉得很舒服,碰巧我也正在写归并算法,于是就用java的GUI实现一个. 归并排序的时间复杂度是T(n)=O ...
- w命令
命 令:w 功能说明:显示目前登入系统的用户信息. 语 法:w [-fhlsuV][用户名称] 补充说明:执行这项指令可得知目前登入系统的用户有那些人,以及他们正在执行的程序.单独执行w 指令会显示所 ...
- django 增加验证邮箱功能
在user文件夹下新建python包,utils 在包内新建文件email_send.py,其中包括验证字符串随机码的产生,数据库的存储和email的发送 # -*- coding: utf-8 -* ...
- keeplived + mysql双主复制部署 --原创
环境: master 1: 192.168.100.10 oracle linux 7.4 mysql 5.7.1 master 2: 192.168.100.11 oracle linux ...
- 深入理解JS对象和原型链
函数在整个js中是最复杂也是最重要的知识 一个函数中存在多面性: 1.它本身就是一个普通的函数,执行的时候形成的私有作用域(闭包),形参赋值,预解释,代码执行,执行完 成后栈内存销毁/不销毁. 2.& ...
- SQL Server 自定义函数(Function)——参数默认值
sql server 自定义函数分为三种类型:标量函数(Scalar Function).内嵌表值函数(Inline Function).多声明表值函数(Multi-Statement Functio ...
- mysql 及练习题
if() 函数的用法 IF(expr1,expr2,expr3),如果expr1的值为true,则返回expr2的值,如果expr1的值为false, mysql,'女','男') as sex fr ...
- 145. Binary Tree Postorder Traversal(二叉树后序遍历)
Given a binary tree, return the postorder traversal of its nodes' values. For example:Given binary t ...
- Web前端页面的浏览器兼容性测试心得(三)总结一些IE8兼容问题的解决方案
由于IE8不支持HTML5,而它又是Win7的默认浏览器,我们即使讨厌它,在这几年却也拿它没办法. 最近做了个需要兼容IE8的项目,不可避免地用了HTML5+CSS3,甚至canvas和svg,做兼容 ...