• 第十六节:类与对象基本概念


    基本概念

    基本概念需要注意的比较散,一些基本的东西吧。

    注意以下成员定义无效:总的来说就是i不接受任何表达式的赋值,只能直接是字符串和数组。

    1 <?php
    2 class SimpleClass
    3 public $var1='hello'.'word';
    4 public $var2=<<<EOT hello world
    5 EOD;
    6 public $var3=1+2;
    7 public $var4=self::mystaticmenthod();
    8 public $var5=$myvar;
    9 ?>

    还有在实力化过程中其实是拷贝。

    <?php
    $foo=new MyClass(); //拷贝1
    $bar=new MyClass(); //拷贝2
    ?>
    

    说到 PHP 的对象,总有一句话:“ PHP 当中对象是按引用传递的,即每个包含对象的变量都持有对象的引用(reference),而不是整个对象的拷贝”。然而这里的“引用”并不是 C++ 程序员所习惯的“引用”——严格来说, PHP 的“对象的引用”其实是对象的标识符的一个拷贝

    C++ 程序员所理解的引用只是对象的另一个名字,本身不占据任何存储空间(指针还储存着指向该对象的地址)。故而 C++ 的引用必须在声明时初始化,且不能再被修改。

    而 PHP 的对象的引用则更接近指针,它储存着该对象的一个“标识符”(类似地址),传递对象时是在拷贝这个标识符。故而你可以修改一个引用使其指向另一个对象(其实是修改了这个引用所储存的标识符)。

    如果我们使用 PHP 的引用操作符 & 来显式地引用一个“对象”(如前文所述,实际上引用的是对象的标识符),那么我们将会得到一个“对象的引用”的引用,修改原引用,那么这个“引用的引用”也会随之更改。

    给一段代码,很能说明问题:

     1 <?php
     2 class foo {
     3   public $bar = 1;
     4 }
     5 
     6 $a = new foo;   //$a其实也是一个引用
     7 $b = $a;        //拷贝引用 ($a)=($b)={id1}
     8 
     9 $a->bar = 2;
    10 echo "b->bar = $b->bar\n";
    11 
    12 $b->bar = 3;
    13 echo "a->bar = $a->bar\n";
    14 //修改了b,但实际上是修改了a和b所引用的同一个对象
    15 //并不会引发 Copy On Write 创建一个新对象b
    16 
    17 $a = new foo;   //$a被修改为一个新的引用,$b没有改变
    18                 //($a)={id2} ($b)={id1}
    19 $a->bar = 4;
    20 echo "b->bar = $b->bar\n";
    21 
    22 $b = &$a;       //显式地使用引用,b成为“对象的引用”的引用
    23 $a = new foo;   //($a)={id3} ($b)=&($a)=&{id3}
    24 $a->bar = 5;
    25 echo "b->bar = $b->bar\n"
    26 ?>

    代码输出:

    b->bar = 2
    a->bar = 3
    b->bar = 3
    b->bar = 5

  • 相关阅读:
    作业五:团队项目——项目启动及需求分析
    结对编程项目---四则运算
    PSP记录个人项目耗时情况
    代码复查
    是否需要有代码规范?
    编写一个能自动生成小学四则运算题目的程序。
    目前流行的源程序版本管理软件和项目管理软件的优缺点
    在Github注册账户
    浏览完整部教材,列出不懂的5-10个问题
    FZU 1683 纪念SlingShot(矩阵水)
  • 原文地址:https://www.cnblogs.com/saw2012/p/2889239.html
Copyright © 2020-2023  润新知