面向对象编程(OOP,Object OrientedProgramming)现已经成为编程人员的一项基本技能。利用OOP的思想进行PHP的高级编程,对于提高PHP编程能力和规划web开发构架都是很有意义的。

这里我主要谈的是this,self关键字之间的区别。从字面上来理解,分别是指这、自己。先初步解释一下,this是指向当前对象的指针(可以看成C里面的指针),self是指向当前类的指针。我们这里频繁使用指针来描述

因为经常用框架的缘故,所以对php底层的一些运行机制和方法都不会了,所以最近比较喜欢研究这些底层的东西,写的东西虽然不是很好,但是自己一步步实地操作过来的,理解起来也比较容易,现在网上大多数的资料要么就是按照手册抄过来很官方的一些话,要么就是那些千篇一律的文章,确实有些不好理解,所以只能自己动手来熟悉啦

一. self
.    1.self可以访问本类中的静态属性和静态方法,可以访问父类中的静态属性和静态方法。用self时,可以不用实例化的
  1. class self_test {
  2. static $instance;
  3. public function __construct(){
  4. self::$instance = 'instance';//静态属性只能通过self来访问
  5. }
  6. public function tank(){
  7. return self::$instance;//访问静态属性
  8. }
  9. }
  10. $str = new self_test();
  11. echo $str->tank();
页面输出:instance
  1. class self_test {
  2. static $instance;
  3. public function __construct(){
  4. self::$instance = 'dell';
  5. }
  6. static public function pentium(){
  7. return self::$instance;//静态方法也可以继续访问静态变量,访问时需要加$
  8. }
  9. public function tank(){
  10. return self::pentium();//访问静态方法pentium()
  11. }
  12. }
  13. $str = new self_test();
  14. echo $str->tank();

页面输出:dell

2.self可以访问const定义的常量

  1. class self_test {
  2. const  NAME = 'tancy';
  3. public function tank(){
  4. return self::NAME;
  5. }
  6. }
  7. $str = new self_test();
  8. echo $str->tank();

页面输出:tancy

二.this
      1.this可以调用本类中的方法和属性,也可以调用父类中的可以调的方法和属性,可以说除过静态和const常量,基本上其他都可以使用this联络

  1. class self_test {
  2. public $public;
  3. private $private;
  4. protected $protected;
  5. public function __construct(){
  6. $this->public = 'public';
  7. $this->private = 'private';
  8. $this->protected = 'protected';
  9. }
  10. public function tank(){
  11. return $this->public;
  12. }
  13. public function dell(){
  14. return $this->private;
  15. }
  16. public function datesrt(){
  17. return $this->protected;
  18. }
  19. }
  20. $str = new self_test();
  21. echo $str->tank();
  22. echo "</br>";
  23. echo $str->dell();
  24. echo "</br>";
  25. echo $str->datesrt();
页面输出: public
       private
       protected
 
一句话,self是引用静态类的类名,而$this是引用非静态类的实例名。

php 中self,this的区别和实地操作的更多相关文章

  1. 正则匹配中 ^ $ 和 \b 的区别

    正则匹配中 ^ $ 和 \b 的区别     ^和$分别代表字符串的开始和结束,因此^\d$只能匹配包含一个数字的字符串\b代表单词边界,其前后必须是不同类型的字符,可以组成单词的字符为一种类型,不可 ...

  2. java中ArrayList 、LinkList区别

    转自:http://blog.csdn.net/wuchuanpingstone/article/details/6678653 个人建议:以下这篇文章,是从例子说明的方式,解释ArrayList.L ...

  3. 数据库中MyISAM与InnoDB区别

    数据库中MyISAM与InnoDB区别 首页 » DIY技术区 » 数据库中MyISAM与InnoDB区别 09:57:40   MyISAM:这个是默认类型,它是基于传统的ISAM类型,ISAM是I ...

  4. socket网络编程中read与recv区别

    socket网络编程中read与recv区别 1.read 与 recv 区别 read 原则: 数据在不超过指定的长度的时候有多少读多少,没有数据则会一直等待.所以一般情况下:我们读取数据都需要采用 ...

  5. 详解 $_SERVER 函数中QUERY_STRING和REQUEST_URI区别

    详解 $_SERVER 函数中QUERY_STRING和REQUEST_URI区别 http://blog.sina.com.cn/s/blog_686999de0100jgda.html   实例: ...

  6. stl 中List vector deque区别

    stl提供了三个最基本的容器:vector,list,deque.         vector和built-in数组类似,它拥有一段连续的内存空间,并且起始地址不变,因此     它能非常好的支持随 ...

  7. java 中 ==和equals 的区别

      Java中equals和==的区别 java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boolea ...

  8. java中equals和==的区别 (转)

    java中equals和==的区别  值类型是存储在内存中的堆栈(以后简称栈),而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中. ==操作比较的是两个变量的值是否相等,对于引 ...

  9. JSP中pageEncoding和charset区别,中文乱码解决方案(转载)

    转载自:JSP中pageEncoding和charset区别,中文乱码解决方案 JSP指令标签中<%@ page contentType="text/html;charset=GB23 ...

随机推荐

  1. python 计时累积超过24小时时继续往上累加

    最近在做一个工具,要求在工具上面加上程序运行的时间,所以做了个计时器 在网上找了很多发现都是24小时制的,超过24小时后就会回0 然后自己根据24小时制修改了一个不停累加时间的 若是想超过24小时后以 ...

  2. apply 和call 的区别,apply实用小技巧

    Js apply方法详解 我在一开始看到javascript的函数apply和call时,非常的模糊,看也看不懂,最近在网上看到一些文章对apply方法和call的一些示例,总算是看的有点眉目了,在这 ...

  3. Java设计模式之十 ---- 访问者模式和中介者模式

    前言 2018年已经过去,新的一年工作已经开始,继续总结和学习Java设计模式. 在上一篇中我们学习了行为型模式的解释器模式(Interpreter Pattern)和迭代器模式(Iterator P ...

  4. C#Url处理类

    using System; using System.Text.RegularExpressions; using System.Web; using System.Collections.Speci ...

  5. meta标签使用方法总结

    meta标签是用来描述一个HTML网页文档的属性,比如该网页的作者,日期,网页的关键字,刷新,网页等级设定等等,是文档中的最基本的元信息,本文是对meta标签的学习总结,内容大多来自网上各个地方,非原 ...

  6. Ubuntu中创建Python虚拟环境

    创建虚拟环境对于Python开发来说是非常重要的,那么该如何创建虚拟环境呢? 1.安装virtulenv工具和管理包 sudo apt-get install python3-virtulenv 或 ...

  7. docker swarm英文文档学习-12-在集群模式中的Raft共识

    Raft consensus in swarm mode 在集群模式中的Raft共识 当Docker引擎在集群模式下运行时,manager节点实现Raft 共识算法来管理全局集群状态.Docker s ...

  8. 椭圆曲线签名算法的v的定义

    在之前的个个与签名相关的地方我都对v的定义感到十分困惑,知道查看了黄皮书以后才对它的作用有了一定地了解,如下: (v is the recovery id: a 1 byte value specif ...

  9. Java部署环境搭建(Linux)

    环境搭建必须jdk.tomcat.mysql(基础) 额外的软件包项目中可能用到 jdk:它包含jre和开发所需完整类库. tomcat:它是一个web容器,项目通常往webapps下扔,便于外界访问 ...

  10. AliOS-Things ESP8266 编译下载

    首先:环境搭建,可以参照https://github.com/alibaba/AliOS-Things/wiki/Quick-Start.zh:我采用的是linux系统: 其次:一般项目文件夹放置在A ...