Php 我们可以从同一类中的另一个成员变量声明并初始化一个成员变量吗

Php 我们可以从同一类中的另一个成员变量声明并初始化一个成员变量吗,php,class,oop,Php,Class,Oop,我不太了解类及其成员变量。 我的疑问是,我们能否从同一类中的另一个成员变量声明并初始化一个成员变量 像这样 class newClass { private $variable1 = 'new1'; private $variable2 = $variable1.'new2'; } 如果不能,请帮我找到解决办法。 如果这是一个错误的问题,请原谅。始终在构造函数中初始化成员变量。您可以在构造函数中指定动态值。 请尝试以下代码: <?php class newClass {

我不太了解
及其
成员变量
。 我的疑问是,我们能否从同一类中的另一个成员变量声明并初始化一个成员变量

像这样

class newClass {
    private $variable1 = 'new1';
    private $variable2 = $variable1.'new2';
}
如果不能,请帮我找到解决办法。
如果这是一个错误的问题,请原谅。

始终在构造函数中初始化成员变量。您可以在构造函数中指定动态值。 请尝试以下代码:

<?php
class newClass {
    private $variable1 ;
    private $variable2;
    function __construct()
    {
      $this->variable1 = 'new1';
      $this->variable2 = $this->variable1.'new2';
    }
    function get_data()
    {
      echo "var1= ".$this->variable1;
      echo "<br>";
      echo "var2= ".$this->variable2;
    }
}
$obj = new newClass();
$obj->get_data();

始终在构造函数中初始化成员变量。您可以在构造函数中指定动态值。
请尝试以下代码:

<?php
class newClass {
    private $variable1 ;
    private $variable2;
    function __construct()
    {
      $this->variable1 = 'new1';
      $this->variable2 = $this->variable1.'new2';
    }
    function get_data()
    {
      echo "var1= ".$this->variable1;
      echo "<br>";
      echo "var2= ".$this->variable2;
    }
}
$obj = new newClass();
$obj->get_data();
不,你不能那样做

您可以改为在构造函数中进行初始化:

class Foo 
{
    private $a = 'something';
    private $b;

    public function __construct() 
    {
        $this->b = $this->a . 'foobar';

    }
}
Buuuut,这实际上是一种有点可疑的做法,因为您应该尽量避免在构造函数中进行任何计算,因为您失去了实际测试该部分逻辑的能力(因为构造函数总是执行的,所以您无法比较前后状态)

更好的方法是将此逻辑保留在getter方法中:

class Foo 
{
    const DEFAULT_VALUE = 'lorem ipsum';
    const DEFAULT_PREFIX = '_';

    private $bar;

    public function __construct(string $bar = self::DEFAULT_VALUE)  
    {
        $this->bar = $bar;
    }


    public function getPrefixedBar(string $prefix = self::DEFAULT_PREFIX)
    {
        return $prefix .  $this->bar;
    }
}
使用此代码,您将获得:

$a = new Foo;
echo $a->getPrefixedBar(); // shows: '_lorem ipsum';
echo $a->getPrefixedBar('test '); // shows: 'test lorem ipsum';

$b = new Foo('xx');
echo $b->getPrefixedBar(); // shows: '_xx';
不,你不能那样做

您可以改为在构造函数中进行初始化:

class Foo 
{
    private $a = 'something';
    private $b;

    public function __construct() 
    {
        $this->b = $this->a . 'foobar';

    }
}
Buuuut,这实际上是一种有点可疑的做法,因为您应该尽量避免在构造函数中进行任何计算,因为您失去了实际测试该部分逻辑的能力(因为构造函数总是执行的,所以您无法比较前后状态)

更好的方法是将此逻辑保留在getter方法中:

class Foo 
{
    const DEFAULT_VALUE = 'lorem ipsum';
    const DEFAULT_PREFIX = '_';

    private $bar;

    public function __construct(string $bar = self::DEFAULT_VALUE)  
    {
        $this->bar = $bar;
    }


    public function getPrefixedBar(string $prefix = self::DEFAULT_PREFIX)
    {
        return $prefix .  $this->bar;
    }
}
使用此代码,您将获得:

$a = new Foo;
echo $a->getPrefixedBar(); // shows: '_lorem ipsum';
echo $a->getPrefixedBar('test '); // shows: 'test lorem ipsum';

$b = new Foo('xx');
echo $b->getPrefixedBar(); // shows: '_xx';