php get set方法深入理解

在类当中,设计通用的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;
时间: 2024-10-12 17:29:51

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

对Vue.js $watch方法的理解

博主最近对着vue.js的官方教程在自学vue.js,博主自幼愚钝,在教程中真的是好多点都不太理解,接下来要说的这个$watch方法就是其中一个不太理解的点了.咱们先来看一下对于$watch方法在vue.js的API中是怎么解释的吧:观察 Vue 实例变化的一个表达式或计算属性函数.回调函数得到的参数为新值和旧值.表达式只接受监督的键路径.对于更复杂的表达式,用一个函数取代.官方示例: 1 // 键路径 2 vm.$watch('a.b.c', function (newVal, oldVal)

Canavs arcTo方法的理解

arcTo方法有四个參数 參数1,2为第一个控制点的x,y坐标,參数2为第二个控制点的坐标,參数3为绘制圆弧的半径. 起点和第一个控制点组成的延长线与第一个控制点和第二个控制点组成的延长线都是和圆弧相切的,这个圆弧也就是被夹在两条延长线中间.圆越大,两条延长线能形成的角度能夹住的圆弧就越小. 以下写了一个简单的动画帮助理解 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <t

C#中Thread类中Join方法的理解(转载)

指在一线程里面调用另一线程join方法时,表示将本线程阻塞直至另一线程终止时再执行      比如 Java代码   using System; namespace TestThreadJoin { class Program { static void Main() { System.Threading.Thread x = new System.Threading.Thread(new System.Threading.ThreadStart(f1)); x.Start(); Console

用实验方法加深理解Oracle的外连接(left/right/full)和内连接(inner)

总是对Oracle的左连接.右连接以及(+)对应的外连接类型糊涂,通过实验加深对连接类型语法的理解.外连接分为三种: 1. 左外连接,对应SQL关键字:LEFT (OUTER) JOIN 2. 右外连接,对应SQL关键字:RIGHT (OUTER) JOIN 3. 全外连接,对应SQL关键字:FULL (OUTER) JOIN 左右外连接都是以一张表为基表,在显示基表所有记录外,加上另外一张表中匹配的记录.如果基表的数据在另一张表中没有记录,那么相关联的结果集行中显示为空值. 精确点说,引用MO

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

转自:http://blog.sina.com.cn/s/blog_61fbf8d10100zzoy.html Android View.onMeasure方法的理解 View在屏幕上显示出来要先经过measure(计算)和layout(布局).1.什么时候调用onMeasure方法? 当控件的父元素正要放置该控件时调用.父元素会问子控件一个问题,“你想要用多大地方啊?”,然后传入两个参数——widthMeasureSpec和heightMeasureSpec.这两个参数指明控件可获得的空间以及

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

对于JAVA初学者来说,set和get这两个方法似乎已经很熟悉了,这两个方法是JAVA变成中的基本用法,也是出现频率相当高的两个方法. 为了让JAVA初学者能更好的理解这两个方法的使用和意义,今天笔者来谈一下自己对这两个方法的理解,如果你对于这两个方法还有困惑甚至完全不知道这两个方法是做什么的,那你看下面这篇文章很有用.如果你对于set和get这两个方法已经很熟悉了,那么你完全不用看这篇文章.这篇文章是写给初学者的. 我们先来看看set和get这两个词的表面意思,set是设置的意思,而get是获

Linux网络编程 五种I/O 模式及select、epoll方法的理解

Linux网络编程 五种I/O 模式及select.epoll方法的理解 web优化必须了解的原理之I/o的五种模型和web的三种工作模式 五种I/O 模式--阻塞(默认IO模式),非阻塞(常用语管道),I/O多路复用(IO多路复用的应用场景),信号I/O,异步I/OLinux网络编程 五种I/O 模式及select.epoll方法的理解

initWithFrame方法的理解

initWithFrame方法的理解 有时候,知道initWithFrame方法如何用,但是么有弄明白initWithFrame方法到底是什么? 那就通过查资料弄明白. 1. initWithFrame方法是什么? initWithFrame方法用来初始化并返回一个新的视图对象,根据指定的CGRect(尺寸). 当然,其他UI对象,也有initWithFrame方法,但是,我们以UIView为例,来搞清楚initWithFrame方法. 2.什么时候用initWithFrame方法? 简单的说,

对javascript中call()方法的理解

call ( thisObj [, arg1 [, arg2 [,  [, argN] ] ] ]) call()方法:官方介绍是,调用一个对象的一个方法,以另一个对象替换当前对象. call()方法应用于Function对象,可以用来代替另一个对象调用一个方法,可将一个函数的对象上下文从初始的上下文改变为thisObj指定的新对象.如果没有提供thisObj参数,那么Global对象被用作thisObj. 直接理解这几句话还是挺难理解的.先看一个例子: function Class1(){ t

Catalina.createDigester方法详细理解

这个方法主要设置(这个方法很重要,贵在理解,虽然还没学过设计模式..) 1.遇到<server>标签时创建StandardServer实例   设置StandardServer类内部的相关属性   并调用Catalina.setServer()方法设置server 2.遇到<Server>标签的子标签<Listener>==>对应匹配模式"Server/Listener"时  创建Listener实例,创建类名通过<Listener cl