在类当中,设计通用的set和get方法,可以简化对属性的读写,这种方法不同于针对于独立的属性的普通的get和set方法,后者针对每个属性,都必须提供一对方法,前者针对所有属性,因此,可以看作是批量定义set和get方法的策略。

另外一种常见的魔术方法是construct,在这里作为对照进行介绍。

第一,关于访问权限修饰符。construct设计为public,那么可以在new创建对象时,系统会调用构造方法对对象进行初始化,否则将无法实例化此类(常用于纯静态类,或者单例模式当中),而set和get,设计为private并不影响功能本身,即系统调用这些方法是不受访问权限所左右的。而设计为public,则可以直接调用这些方法本身。

第二,关于返回值。get方法的返回值,作为属性结果,而construct和set方法的返回值是没有任何意义的,并不会被采用。如下:

echo $obj->pro = "value";

打印的值将是value,而不论set方法的返回值是什么。

第三,关于使用的情境。需要取得$obj->pro值的情况下,会首先寻找公共的pro属性,如果没有找到,会查看是否有get方法,并将其返回值作为结果,如果没有get方法,将会寻找私有属性,找到后会报错,如果私有属性也找不到,会临时创建一个公共属性。

<?php
class User{
private $id;
private $name;
} $user = new User();
$user->ac = 6;//不报错,临时产生一个公共属性
echo $user->ac;
?>

在$obj->pro = "value"的情况下,会首先寻找公共pro属性,如果没有找到,会启用set方法,如get类似。

上述语法,在类本身也有用,如果类的某个方法有$obj->pro的表达式,那么,它会首先寻找属性,然后采用get方法,当然,私有属性和公共属性都会被首先寻找,然后才会考虑get方法,set方法类似。

但是isset魔术方法,是优先于get方法的,也就是说,如果客户端代码如下:

isset($obj->pro),会首先检查是否有pro公共变量,然后检查isset方法,如果有,将会读取isset方法,然后将返回值确定为检查结果,如果没有,才会考虑用get方法的过程。

第四,关于继承。这些魔术方法均会被子类继承,继承时,父类可以访问子类中的非私有变量和方法,但是无法访问私有变量和方法。这个问题会导致一个值得注意的细节,比如在父类当中,我们把set方法定义为赋值给一个叫_pro的变量,那么,如果子类直接继承这个set方法,它将能够有效赋值给父类当中定义的私有变量,但是对于子类当中的私有变量,它并没有多态的权限,因此,无法赋值。

class User{
private $id;
private $name = "jiangbo"; public function __get($property_name)
{
if(isset($this->$property_name))
{
if($property_name == "cd"){
return $this->_cdtime;
}
return($this->$property_name);
}
else
{
return("no find");
}
}
//__set()方法用来设置私有属性
public function __set($property_name, $value)
{
$this->$property_name = $value;
}
} $user = new User();
echo $user->ac;//"no find"
echo "<br>";
echo $user->name;

php get set方法深入理解的更多相关文章

  1. 转载:JAVA中关于set()和get()方法的理解及使用

    对于JAVA初学者来说,set和get这两个方法似乎已经很熟悉了,这两个方法是JAVA变成中的基本用法,也是出现频率相当高的两个方法. 为了让JAVA初学者能更好的理解这两个方法的使用和意义,今天笔者 ...

  2. [转]Android View.onMeasure方法的理解

    转自:http://blog.sina.com.cn/s/blog_61fbf8d10100zzoy.html Android View.onMeasure方法的理解 View在屏幕上显示出来要先经过 ...

  3. 五种I/O 模式,select、epoll方法的理解,BIO、NIO、AIO理解 相关文章

    一.io方式 Linux网络编程 五种I/O 模式及select.epoll方法的理解 web优化必须了解的原理之I/o的五种模型和web的三种工作模式 五种I/O 模式——阻塞(默认IO模式),非阻 ...

  4. initWithFrame方法的理解

    initWithFrame方法的理解   有时候,知道initWithFrame方法如何用,但是么有弄明白initWithFrame方法到底是什么? 那就通过查资料弄明白.     1. initWi ...

  5. java中set和get方法的理解

    对于JAVA初学者来说,set和get这两个方法似乎已经很熟悉了,这两个方法是JAVA变成中的基本用法,也是出现频率相当高的两个方法. 为了让JAVA初学者能更好的理解这两个方法的使用和意义,今天笔者 ...

  6. 对Vue.js $watch方法的理解

    博主最近对着vue.js的官方教程在自学vue.js,博主自幼愚钝,在教程中真的是好多点都不太理解,接下来要说的这个$watch方法就是其中一个不太理解的点了.咱们先来看一下对于$watch方法在vu ...

  7. Thread线程join方法自我理解

    Thread线程join方法自我理解 thread.join():等待thread线程运行终止,指的是main-thread(main线程)必须等待thread线程运行结束,才能继续thread.jo ...

  8. JAVA中关于set()和get()方法的理解及使用

    对于JAVA初学者来说,set和get这两个方法似乎已经很熟悉了,这两个方法是JAVA变成中的基本用法,也是出现频率相当高的两个方法. 为了让JAVA初学者能更好的理解这两个方法的使用和意义,今天笔者 ...

  9. Catalina.createDigester方法详细理解

    这个方法主要设置(这个方法很重要,贵在理解,虽然还没学过设计模式..) 1.遇到<server>标签时创建StandardServer实例   设置StandardServer类内部的相关 ...

  10. 对virtual虚方法的理解

    对virtual虚方法的理解 https://www.cnblogs.com/u3ddjw/p/6676485.html

随机推荐

  1. XAMPP启动mysql遇到的问题

    Version: '10.1.9-MariaDB' socket: '' port: 3306 mariadb.org binary distribution2016-07-18 10:42:04 1 ...

  2. 学习LCMapString和LCMapStringEx

    LCMapStringEx: http://msdn.microsoft.com/en-us/library/windows/desktop/dd318702(v=vs.85).aspx For a ...

  3. Interview----判断两个链表是否相交?

    题目描述: 判断两个单链表是否相交?假设链表没有环. 假如链表有环呢? 1.  假如没有环 那么如果两个链表相交的话,必然最后的节点一定是同一个节点.所以只需要各自扫描一遍链表,找到最后一个节点,比较 ...

  4. swift 闭包+嵌套函数+extension+单例+嵌套函数+??

    //: Playground - noun: a place where people can play import UIKit //*******************嵌套函数********* ...

  5. iOS:测试机添加

    一,首先打开开发者首页:https://developer.apple.com/,点击Member Center二,点击certificates,Identifiers & Profiles三 ...

  6. Charlie's Change_完全背包&&路径记录

    Description Charlie is a driver of Advanced Cargo Movement, Ltd. Charlie drives a lot and so he ofte ...

  7. Ensemble Approaches分类技术

    所谓ensemble learning,简单来说,是指综合多种基础模型或弱分类器来完成最终的决策的机器学习方法. Bagging和Boosting(之前所提到的Adaboost)都属于这类方法. Co ...

  8. Find Minimum in Rotated Sorted Array II

    Follow up for "Find Minimum in Rotated Sorted Array":What if duplicates are allowed? Would ...

  9. dedecms内容页调用缩略图 缩略图多种用法(借鉴)

    文章内容页调用缩略图方法如下两种.第一种没有大小设置.原图显示.第二种.可以设大小, (1) {dede:field.image/} (2)<img src="{dede:field. ...

  10. java中byte数据转换为c#的byte数据

    最近在做下载方面的开发.有一个需求,就是读取要下载的文件中的一些数据,比如要读取这个文件包含的用户信息,但是怎么读都不对.后来搞了很久才发现,服务器上的文件里的用户信息,用C#写的存储方法来存储的,而 ...