回应PHP类中的变量

时间:2016-12-21 11:00:57

标签: php class oop properties

我快速浏览了一些与我相似的问题,但没有一个答案能够解决我遇到的问题。

我有两个文件。 product.php index.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中定义的类尝试了这个,它运行正常。这让我觉得我的文件路径可能有问题,但文件名拼写正确,文件在同一个目录中,所以我不完全确定。

6 个答案:

答案 0 :(得分:1)

panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0xffffffff addr=0x0 pc=0x20314]

goroutine 1 [running]:
panic(0x112c00, 0x1040a038)
    /usr/local/go/src/runtime/panic.go:500 +0x720
main.main()
    /tmp/sandbox675251439/main.go:23 +0x314

Program exited.

答案 1 :(得分:1)

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

多数民众赞成。

答案 2 :(得分:1)

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

    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();

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

/**product.php**/
public function getVariable() {
   return $this->var;
}


/**index.php**/
$product = new Product('new text');
echo $product->getVariable();

这取决于您是否只需要显示此变量,或者您知道,您将需要此变量用于其他事项。无论哪种方式,我认为创造吸气剂也更好,因为一个好习惯。

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

答案 3 :(得分:1)

解释相关

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

此外,如果您正在使用构造函数,则在调用构造函数之前无需为变量赋予默认值。

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

解决方案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();

解决方案3:使用构造函数初始化值

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

答案 4 :(得分:0)

你有

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

应该是:

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

答案 5 :(得分:0)

请修改您的代码

<强> 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; ?>

它可能对你有帮助。

由于