【问题标题】:Echoing a variable from a PHP class从 PHP 类中回显变量
【发布时间】:2017-05-06 18:49:54
【问题描述】:

我快速浏览了一些与我类似的问题,但没有一个答案完全触及我遇到的问题。

我有两个文件。 product.phpindex.php。 Product.php 定义了产品类,我只是使用 index.php 作为页面来输出变量。理想情况下,这将用于在将来输出来自不同类的对象。

product.php

class Product{
    public $var = "a default value";

    public function __construct($var){
        $var = $var;
    }

    public function displayVar(){
        echo $this->var;
    }
}

index.php(都被php标签包围)

require_once("product.php");
$product = new Product();
echo $product->var;

我尝试了包含文件的不同方法(require、include、include_once)。我不确定这是否是问题所在。

我遇到的问题是 $product->var 没有输出。相反,我收到以下错误:

Notice: Undefined property: Product::$var in C:\xampp\htdocs\FurnitureWebsite\index.php on line 21

我不完全确定为什么它考虑这个变量未定义。我查看了关于类和属性的 PHP 文档,但没有一个真正看起来像答案的东西。

最后一点:我用 index.php 中定义的类尝试了这个,它工作得很好。这让我觉得我的文件路径可能有问题,但是文件名拼写正确,并且文件在同一个目录中,所以我不太确定。

【问题讨论】:

  • $this->var = $var; 更改值绑定
  • 附带说明,让公共 getter displayVar 回显公共属性是没有意义的。由于它是公开的,因此您可以直接访问它。或者,如果您想通过显式 getter 限制对该属性的访问,请将属性的可见性更改为受保护或私有。

标签: php class oop properties


【解决方案1】:

说明

首先,在您的类中,您为构造函数指定了一个变量。但是,这个变量是强制性的(意味着没有默认值)。所以在实例化一个新产品时,你必须给出一个值

此外,如果您使用的是构造函数,则无需在调用构造函数之前给变量一个默认值。

也就是说,如果您想在不调用方法的情况下访问您的值,那么有很多解决方案。

方案一:实例化并直接调用变量

class Product {

    public $var = 'a default value';

}

$product = new Product();

echo $product->var;

解决方案 2:使用访问器获取受保护/私有值

class Product {

    protected $var = 'a default value';

    public function getVar() {

        return $this->var;

    }

}

$product = new Product();

echo $product->getVar();

方案三:使用构造函数初始化值

class Product {

    protected $var;

    public function __construct($var = 'a default value') {

        $this->var = $var;

        /* $this->var stands for protected $var */

        /* $var stands for... $var in the parameters */

    }

    public function getVar() {

        return $this->var;

    }

}

$product = new Product(); /* no value, so $var = 'a default value'; */

echo $product->getVar();

解决方案 4:使用静态变量

class Product {

    public static $var = 'a default value';

}

echo Product::$var;

解决方案 5:使用带有受保护静态值的静态方法

class Product {

    protected static $var = 'a default value';

    public static function getVar() {

        return self::$var;

    }

}

echo Product::getVar();

文档

PHP : classes and objects.

PHP : visibility.

PHP : static.

PHP : constructors and destructors.

【讨论】:

    【解决方案2】:
    class Product{
        public $var = "a default value";
    
        public function __construct($var){
            $this->var = $var;
        }
    
        public function displayVar(){
            return $this->var;
        }
    }
    
    require_once("product.php");
    $product = new Product('Product Name');
    echo $product->displayVar();
    

    【讨论】:

      【解决方案3】:
      class Product{
          protected $var;
      
          public function __construct($var = "a default value"){
              $this->var = $var;
          }
      
          public function getVar(){
              return $this->var;
          }
      }
      
      $product = new Product();
      echo $product->getVar();
      
      • 您必须在new Product('your value') 上给出值,您的示例没有给构造函数的值
      • 正确绑定,不要$var=$var$this->var=$var
      • __construct($var = "a default value")中设置默认值,比直接在属性中更好
      • 使变量protected 不是public 否则不需要getter,变量可以直接从外部更改
      • 为变量创建一个getter,它返回值,而不是echo

      就是这样。

      【讨论】:

        【解决方案4】:

        在你的构造函数中你有这个:

            public function __construct($var){
               $var = $var;
            }
        

        改成:

            public function __construct($var){
               $this->var = $var;
            }
        

        目前它只是将传递的变量设置为自身。

        第二件事是在你的 index.php 文件中创建一个像这样的对象:

        $product = new Product();
        

        因为你的构造函数期望得到一些变量,你应该总是提供这样的。 例如:

        $product = new Product('new text');
        

        我可以看到你有一个显示变量的方法。这很好,尽管常见的做法是创建 protected 这样的变量,然后创建一个 public getter 方法来从类外部访问受保护的变量。 然后你可以像这样简单地从 index.php 文件中调用你的方法:

        $product->displayVar();
        

        或创建将返回变量并将其显示在 index.php 文件中的 getter 方法。 例如。

        /**product.php**/
        public function getVariable() {
           return $this->var;
        }
        
        
        /**index.php**/
        $product = new Product('new text');
        echo $product->getVariable();
        

        这取决于您是否只需要显示这个变量,或者您知道,您将需要这个变量来做其他事情。无论哪种方式,我认为创建 getter 更好也是因为一个好习惯。

        我希望它有所帮助。祝你好运!

        【讨论】:

          【解决方案5】:

          你有

          public function __construct($var){
              $var = $var;
          }
          

          应该是:

          public function __construct($var){
              $this->var = $var;
          }
          

          【讨论】:

            【解决方案6】:

            请像这样修改你的代码

            Product.php

            <?php class Product{
                public $var ;
                public function __construct($var){
                        $this->var = $var;
                } } ?>
            

            index.php

            <?php require_once 'product.php';
                 $product = new Product('a default value');
                 echo $product->var; ?>
            

            也许对你有帮助。

            谢谢

            【讨论】:

              猜你喜欢
              • 2011-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-08-17
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多