PHP-严格标准:以非静态方式访问静态属性-没有什么是静态的


PHP - Strict Standards: Accessing static property as non static - Nothing is static?

我不知所措。我已经把我的两节课复习了好几个小时了。没有任何东西是静态的,没有任何东西被静态引用,但我无法摆脱这个错误。

A类文件(ClassA.php

<?php
namespace MyProject'A;
require_once "B.php";
use MyProject'B as B;
class A
{
    private $privateVariable;
    public function __construct()
    {
        $b = new B'B();
        $this->privateVariable = $b->something;
    }
}

B类文件(B.php

<?php
namespace MyProject'B;
class B
{
    public $something;
    public function __construct()
    {
        $this->something = "Some (dynamic) string value";
    }
}

我对类并不陌生,但我以前从未遇到过这个问题(至少没有静态变量、方法或静态引用)。


我得到的错误是:

严格标准:在线访问A.php中的静态属性MyProject''B''B::$something作为非静态属性(此行:$this->privateVariable = $b->something

注意:未定义的属性:MyProject''B''B::$something in A.php on line(此行:$this->privateVariable = $b->something

我想任何读过这篇文章的人都明白,我想把B的变量$something变成A的变量$privateVariable,同时在实例化A类时将类B保持为类A中的实例,比如:

<?php
namespace MyProject'Something;
require_once "A.php";
use MyProject'A as A;
$a = new A'A()
// $a's private variable $privateVariable should be set to "Some (dynamic) string value"

非常感谢有关此问题的任何帮助!


编辑
更改代码以更好地反映原始代码(将use AS更改为use as并更改调用适当类的方式

PHP版本:5.6
编辑2
我真的不知道发生了什么。

  • 我已将文件上传到服务器
  • 然后我检查了它们是否正确上传
  • 我仍然收到那些错误
  • 然后我对除上面几行之外的所有代码进行了注释
  • 我仍然收到错误
  • 然后我取消了刚刚注释掉的行的注释(使用CTRL+Z)
  • 然后我重新加载了文档
  • 我确保它们被正确上传
  • 现在一切正常

我为这个问题道歉,但我认为这更多的是一个错误,而不是一个实际的代码问题。我会把这件事归咎于Godaddy(是的,我知道Godaddy讽刺是个不错的选择)

这里,完整的工作单文件示例:

namespace MyProject'ClassA {
    use MyProject'ClassB'B;
    class A {
        private $privateVariable;
        public function __construct() {
            $b = new B();
            $this->privateVariable = $b->something;
            print $this->privateVariable;
        }
    }
}
namespace MyProject'ClassB{
class B{
    public $something;
    public function __construct()
    {
        $this->something = "Some (dynamic) string value";
    }
}
}
namespace MyProject'Something {
    use MyProject'ClassA'A;
    $a = new A();
}

测试一下。

更新:

您使用:

 use MyProject'A as A;
 $a = new A'A();

但是use MyProject'A指向的是一个命名空间而不是一个类。

所以这是正确的:

use MyProject'A'A as A;
$a = new A();

另一个注释使用了这个:use 'MyProject'A'A'在第一位。

我认为您的名称空间不正确。我敢打赌,PHP无法实例化该类,并假设您是静态调用它的。我清理了名称空间,创建了一个巨大的文件,它运行得很好

namespace MyProject'ClassB;
class B
{
    public $something;
    public function __construct()
    {
        $this->something = "Some (dynamic) string value";
    }
    public function getStr() {
        echo $this->something;
    }
}
namespace MyProject'ClassA;
use 'MyProject'ClassB'B as B;
class A
{
    private $privateVariable;
    public function __construct()
    {
        $b = new B();
        $this->privateVariable = $b->something;
        $b->getStr();
    }
}
namespace MyProject'Something;
use 'MyProject'ClassA'A as A;
$a = new A();

有一点值得注意:你写的不是use ... AS ...,而是use ... as ...。AS应该是所有较低的情况。因此则正确的CCD_ 12应该是:CCD_。下面的代码摘录将说明这些要点。

    <?php
        namespace MyProject;
        require_once "ClassB.php";
        use MyProject'B as cB;
        class A {
            private $privateVariable;
            public function __construct()   {
                $b = new cB();
                $this->privateVariable = $b->getSomething();
            }
        }
    ?>
    <?php
        namespace MyProject;
        class B{
            public $something;
            public function __construct(){
                $this->something = "Some (dynamic) string value";
            }
            // YOU MAY WANT TO CREATE A FUNCTION TO GET THE SOMETHING          
            public function getSomething(){
               return $this->something;
            }
        }

或者使用混叠。。。。

    <?php
        namespace MyProject'ClassA;
        require_once "ClassB.php";
        use MyProject'ClassB as cB;
        class A {
            private $privateVariable;
            public function __construct(){
                $b = new cB'B();
                $this->privateVariable = $b->getSomething();
            }
        }
    ?>
    <?php
        namespace MyProject'ClassB;
        class B{
            public $something;
            public function __construct(){
                $this->something = "Some (dynamic) string value";
            }
            // YOU MAY WANT TO CREATE A FUNCTION TO GET THE SOMETHING          
            public function getSomething(){
               return $this->something;
            }
        }

要运行代码(第一个示例-没有别名)::

    <?php
        namespace MyProject'Something;
        use MyProject'A as A;
        require_once "A.php";
        require_once "B.php";        
        $a = new A();
        var_dump($a);
        // PRODUCES:::
        object(MyProject'A)[1]
            private 'privateVariable' => string 'Some (dynamic) string value' (length=27)

在这里自己测试一下。