Php $this关键字和压缩函数

Php $this关键字和压缩函数,php,arrays,oop,Php,Arrays,Oop,在某些上下文中,我们可以使用数组($this'variable')语法来引用对象属性。为什么compact(数组($this,'variable'))不起作用?有办法解决这个问题吗 上课{ $result='something'; 公共功能输出(){ compact($this->result);//$这是一个OOP关键字,我不知道如何在compact()括号中使用它 } } 目前我只找到了一个解决方案: $result=$this->result; 紧凑(“结果”); 但这很难看。您必须

在某些上下文中,我们可以使用
数组($this'variable')
语法来引用对象属性。为什么
compact(数组($this,'variable'))不起作用?有办法解决这个问题吗


上课{
$result='something';
公共功能输出(){
compact($this->result);//$这是一个OOP关键字,我不知道如何在compact()括号中使用它
}
}
目前我只找到了一个解决方案:

$result=$this->result;
紧凑(“结果”);

但这很难看。

您必须定义索引字段。比如: $array=compact('this','variable')

compact()
在中查找变量名<代码>$this
不存在于其中。您希望
$this
的名称是什么

你可以做:

class Foo
{
    function __construct()
    {
        $that = $this;
        $var = '2';
        print_r( compact(array('that', 'var')) );
    }
}
讽刺的是,一旦您将$this分配给$that,$this也可以用'this'而不是'that'来压缩。看见出于性能原因,
$this
和超级全局变量仅在需要时填充。如果不需要它们,它们就不存在


更新后编辑

你的
compact($this->result)
查找在
output()
方法的local/current范围内定义的“某物”。由于没有这样的变量,因此生成的数组将为空。这将有助于:

public function output() 
{
    $something = 1;
    print_r( compact($this->result) );
}

简短回答:不要使用
compact()
。在这种情况下,这是毫无意义的(在大多数情况下,这是毫无意义的,但这是另一回事)。相反,只返回数组有什么不对

return array('variable' => $this->variable);

您需要使用
get\u class\u vars()
,它返回所提供类的所有属性(类变量)的关联数组,并将变量名称作为键。在类内使用
get\u class\u vars(get\u称为\u class())
以字符串形式获取该类的名称<代码>获取类($this)也可以使用

当然,这将为您提供类的所有属性(无论访问控制修改器如何),因此您可能还希望筛选此列表。一种简单的方法(如果有点模糊)是使用
array\u intersect\u key()
以及
array\u flip()
,如所示。所以整个事情看起来像:

array_intersect_key( get_class_vars( get_called_class() ), array_flip( array( 'var_1', 'var_2', 'var_3' ) ) );
您必须决定生成的代码是否真的值得。它可能更容易阅读
数组('var\u 1'=>$this->var\u 1,'var\u 2'=>$this->var\u 2)如前所述

但是,因为a)我喜欢,b)因为我是一个非常勤奋的人,c)Perl中可能有一行代码做得很好,下面是我试图解决的问题的上下文中的代码:用数字(但不是全部)覆盖关联数组(这也是当前类的一个属性)属于同一类的其他属性

<?php
class Test {
    protected $var_1 = 'foo';
    private $var_2 = 'bar';
    public $var_3 = 'baz';
    private $ignored_var = 'meh';

    public $ary = array( 
        'var_1' => 'bletch',
        'var_2' => 'belch',
        'var_4' => 'gumbo',
        'var_5' => 'thumbo'
    );

    public function test(){
        $override = array_intersect_key( get_class_vars( get_called_class() ), array_flip( array( 'var_1', 'var_2', 'var_3' ) ) );
        return array_merge( $this->ary, $override );
    }
}

$test = new Test();
var_dump( $test->test() );

请注意,在我自己的使用中,我不会将其分成两行,但我希望将引用OP的代码分开。

我知道这很旧,但我希望在我正在进行的项目中使用类似的代码。我想与大家分享我提出的解决方案:

extract(get_object_vars($this));
return compact('result');
它的伸缩性相当好。例如:

<?php

class Thing {
    private $x, $y, $z;

    public function __construct($x, $y, $z) {
        $this->x = $x;
        $this->y = $y;
        $this->z = $z;
    }

    public function getXYZ() {
        extract(get_object_vars($this));
        return compact('x', 'y', 'z');
    }
}


$thing = new Thing(1, 2, 3);
print_r($thing->getXYZ());

我今天需要类似的东西–compact的功能,但是在对象范围内,而不是在当前符号表中。所以我写了这个:

if(!function_存在(“compact_with”)){
/**
*创建选定对象特性及其值的数组
*
*@param mixed$obj从中获取属性的对象
*@param mixed$args将属性名称设置为字符串或字符串数组
*@return array属性及其值的关联数组
*/
带有($obj,…$args)的函数compact_:数组
{
数组映射(
功能($v)使用($obj和$ret){
$ret[$v]=is_阵列($v)?使用($obj,$v)压缩_:$obj->$v;
},
$args
);
返回$ret???[];
}
}
$foo->foo=“foo”;
$foo->bar=“bar”;
$foo->baz=“baz”;
$result=compact_与($foo,“bar”,“foo”,“baz”);
var_dump($结果);
输出:

数组(3){
'酒吧'=>
字符串(3)“bar”
‘foo’=>
字符串(3)“foo”
‘baz’=>
字符串(3)“baz”
}

compact
一样,如果参数中包含无效的属性名,则会发出通知。

我正在搜索相同的内容,希望避免这种丑陋。后来我使用了下面的代码,我想我应该在这里贡献它:

return array_merge(compact('other', 'beautiful', 'variables'), 
  ['result' => $this->result]);

这样,您就可以继续对其他漂亮的变量使用compact了

我对这个函数或“extract”知道的不多,但我可以告诉你,这里的末尾缺少了一个括号。可能只是一个换位问题,但这可能是你的问题?在其他新闻中,我冒昧猜测$this不是对象符号表的一部分,因此无法正确打包。不需要
array()
,您必须指定“this”,而不是$this。@greg0rie,这是您的工作方式吗?您使用哪一个PHP版本?“在大多数情况下,它是毫无意义的”-请您详细说明一下好吗?我也没有收到您的说明。Compact帮助我很多时候虽然我同意这种情况,正如@chris所问的,你能解释一下为什么这个函数毫无意义,让其他人能理解吗?我想他只是想说你不需要一个函数来做数组('key'=>$val)。。就我个人而言,我不喜欢使用紧凑型。当我使用尚未定义的变量名时,PHPStorm一眼就看不出问题。此外,重构变量名也有点困难(必须使用重命名所有实例,我不喜欢这样做)咕噜咕噜咕噜咕噜咕噜咕噜-作为一个幽默的轶事,在剃掉这只牦牛并写出这个可爱的SE答案之后,事实证明,它根本不适用于我:我的类属性的命名与关联数组中的预期参数不同。看起来我将使用'var\u 1'=>$this->some\u other_
return array_merge(compact('other', 'beautiful', 'variables'), 
  ['result' => $this->result]);