初学者请教下PHP手册中创建类的实例化对象的问题

查看:83
本文介绍了初学者请教下PHP手册中创建类的实例化对象的问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

本人初学者,是看着PHP官方手册来学习PHP,在类与对象这一章节有些地方不是很明白,希望在这里能得到帮助。代码如下:

class test {
  public function counter() {
    $c = 0;
    $c += 1;
    echo $c;
  }
}
$o = new test; 
$o -> counter();        // 输出:1
echo '<br>';
$p = new test;
$p -> counter();        // 输出:1

检测
$o == $p true
$o === $p false
想了解下在内存里,$o 与 $p 是如何分布的,之间是何种关系?
如将counter()中的$c定义为静态成员。

class test {
  public function counter() {
    static $c = 0;
    $c = $c + 1;
    echo $c;
  }
}
$o = new test;
$o -> counter();        // 输出:1
echo '<br>';
$p = new test;
$p -> counter();        // 输出:2  为什么这里输出为2?????

在static关键字这一节中,讲到静态属性不能通过一个类已实例化的对象来访问(但静态方法可以)。

class test {
  public static $str = 'Hello World!';
}
$o = new test;
echo $o::$str;        // 正常输出'Hello World'。为什么这里通过实例化对象是可以访问静态属性的

希望能得到大家的帮助,谢谢~

解决方案

首先纠正你几个误区,成员应该声明在类中,你却声明在函数中,那叫局部变量。静态属性不能通过一个类已实例化的对象来访问这句话可能有点难理解,或许是翻译不准确,并不是说不能访问静态成员,而是说不能以动态的方式访问静态成员。给你举个栗子

<?php
class a
{
    private static $n;//声明静态成员
    public static function b()//静态方法
    {
        //$this->n;动态调用静态成员,错误
        self::$n += 1;//静态调用,正确
        echo self::$n,  ',';
    }
}
a::b();//静态调用方法,可行
(new a)->b();//动态调用方法,可行
//最后输出"1,2"

最后说明一下,对象一旦被实例化就是单独存在于内存中的数据,除了静态数据其他都在内存中独占。全等操作符比较对象时,是判断是否指向同一个对象实例,而不是判断是否属于同一个类。如果
$a = new a;
$b = new a;
则$a === $b不成立,如果
$a = new a;
$b = $a;
则$a === $b成立。
注意,PHP中对象的传递不是引用,而是传递指向对象实例的内置标识符,访问对象时系统根据这个标识符进行查找访问指定对象。

这篇关于初学者请教下PHP手册中创建类的实例化对象的问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆