PHP isset在非空变量上返回false

问题描述

在这里,我不得不使用isset(),即使变量中有值,它也会返回false。我的PHP版本是这样:

PHP 7.0.33-14+ubuntu18.04.1+deb.sury.org+1 (cli) (built: Dec 18 2019 14:55:39) ( NTS )
copyright (c) 1997-2017 The PHP Group
Zend Engine v3.0.0,copyright (c) 1998-2017 Zend Technologies
    with Zend OPcache v7.0.33-14+ubuntu18.04.1+deb.sury.org+1,copyright (c) 1999-2017,by Zend Technologies
    with Xdebug v2.6.1,copyright (c) 2002-2018,by Derick Rethans

我的laravel版本是这样:

"laravel/framework": "5.5.28",

这是其中包含isset()的一段代码

return isset($this->pivot->factor) ? $this->pivot->factor : $this->getFactor();

现在,如果我这样做:

\Log::debug('$this->pivot->factor',[$this->pivot->factor]);

变量$this->pivot->factor中的值是11,这是正确的,但是如果我执行dd(isset($this->pivot->factor));,它将返回false。这里发生了什么?该如何解决

编辑 这是方法

 public function getLinkedFactor()
    {
        if ($this->priceResponce) {

            $rateAdditionals = $this->priceResponce->rate->additionals;

            $rateAdditional = $rateAdditionals->filter(function ($item) {
                return $item->id == $this->id;
            })->first();


            if ($rateAdditional && $rateAdditional->pivot->factor) {
                return $rateAdditional->pivot->factor;
            }
        }

        \Log::debug('$this->pivot->factor',[$this->pivot->factor]);

        return isset($this->pivot->factor) ? $this->pivot->factor : $this->getFactor();
    }

这是访问该代码的测试:

/**
     * @test
     */
    public function shouldConsiderLinkedFactor()
    {
        $officeAttrs = [
            'id' => 1,'additional_id' => 2,'office_id' => 3,'factor' => 11
        ];

        $officeAdditional = $this->makeEloquentMock(OfficeAdditional::class,$officeAttrs);
        $officeAdditional->shouldReceive('hasGetMutator')->andReturn(true);
        $officeAdditional->shouldReceive('getAttributeValue')->andReturn($officeAttrs['factor']);
        $officeAdditional->shouldReceive('toJson');

        $attributes = [
            'additional_type_id' => 2,'factor'   => 10,'name'     => 'test fixed additional','description' => 'asdasdasd','has_input' => false,'kind'     => 'linked','input_label' => '','carrier_facing_cost' => 1,'min' => 5,'max' => 10
        ];

        $additional = Additional::make($attributes);


        $additional->pivot = $officeAdditional;

        $this->assertEquals($officeAttrs['factor'],$additional->getLinkedFactor());
    }

解决方法

我发现这种情况下的解决方法是这样的。我替换了这一行:

return isset($this->pivot->factor) ? $this->pivot->factor : $this->getFactor();

与此:

return $this->pivot === null ? $this->getFactor() : $this->pivot->factor === null ? $this->getFactor() : $this->pivot->factor;

这样,我不必使用isset()

,

我没有50分可以加入上面的评论,所以我希望这是一个足够的答案。 https://laravel.com/docs/7.x/eloquent-resources#conditional-relationships

更新:将getLinkedFactor的最后一行替换为

eg. const user = require('../model/user');