为什么PHP私有变量在扩展类时会公开

时间:2016-06-03 20:43:31

标签: php

我创建了以下课程 PHP ver 5.5

#!/bin/bash
# A simple Azure storage example

export AZURE_STORAGE_ACCOUNT=<storage_account_name>
export AZURE_STORAGE_ACCESS_KEY=<storage_account_key>

export container_name=<container_name>
export blob_name=<blob_name>

export image_to_upload=\Downloads\\uploadtest.txt

echo "Creating the container..."
azure storage container create $container_name

echo "Uploading the image..."
azure storage blob upload $image_to_upload $container_name $blob_name

echo "Listing the blobs..."
azure storage blob list $container_name

echo "Done"

然后是扩展类

abstract class Model
{
    var $id;

    private $cName;
    private $tName;

    public function __construct($id = 0)
    {
        $this->cName = 'Im cName';
        $this->tName = 'Im tName';            
    }
}

如果我执行此操作:

class claseExtend extends Model
{
    var $id;

    public function hola()
    {
        $this->id = 1;
        return (array) $this;
    }
}

我期待得到:array(id =&gt; 1)

但是输出是:array(\ u0000Model \ u0000cName:=&gt;'Im cName',         \ u0000Model \ u0000tName =&gt; '我tName')

我做错了什么,或者如果属性是私有的,为什么会发生这种情况?

¿为什么数组强制转换包含私有属性?

感谢您的帮助。

2 个答案:

答案 0 :(得分:4)

print_r是一个特殊的魔术函数,它将显示包含私有属性和受保护属性的类。这是一个调试实用程序功能。引自manual

  

print_r()var_dump()var_export()也会   使用PHP 5显示对象的受保护和私有属性。静态   班级成员不会出现。

在PHP中,私有属性 在派生类中继承,但它们不可访问。

答案 1 :(得分:4)

将对象强制转换为数组时,结果中包含private和protected属性。 documentation说:

  

如果将对象转换为数组,则结果是一个数组,其元素是对象的属性。键是成员变量名,有一些值得注意的例外:整数属性是不可访问的;私有变量的类名前置于变量名;受保护的变量有一个&#39; *&#39;前置于变量名称。这些前置值在任一侧都有空字节。

这些空字节在结果中显示为\u0000