【问题标题】:PHP use global variables in class/object [duplicate]PHP在类/对象中使用全局变量[重复]
【发布时间】:2012-10-10 14:26:12
【问题描述】:

可能重复:
Workaround for basic syntax not being parsed

我不明白如何在 php 中使用对象内部的变量。

例如在 javascript 中,我会这样做,这很好。

var foo = 10,
    bar = {option: foo+5}
;

console.log(bar.option);

在 php 中我也是这样做的,但是失败了

$variable = 10;

class myObject {
    var $username = $variable + 5 ;
    var $zzz = $username + 5;

}

也可以在对象中或仅在函数中使用$this 吗?

最后,我将如何设置基于同一对象内另一个变量的变量,例如在 myObject 的第二行中? :)

【问题讨论】:

  • 使用构造函数,Luke。 (请阅读手册。)

标签: php class variables object


【解决方案1】:

正确的方法是使用constructor - 一种在创建对象时运行的方法。

当您定义class properties 时,您只能使用常量值(例如1'xyz'array() 都可以),而不是需要在运行时计算的表达式。

将变量传递给构造函数,不要使用全局变量。

class myObject {
    public $username;
    public $zzz;

    public function __construct($variable) {
        $this->username = $variable + 5 ;
        $this->zzz = $this->username + 5;
    }
}

$obj = new myObject(10);
echo $obj->username; //15

在 PHP 中,如果您不想编写 OOP 代码,则不需要使用类和对象。您可以简单地创建良好的旧功能。但如果您想使用它们,请尝试熟悉 OOP 概念。

【讨论】:

  • @Tomas 一个简单的值。没有函数调用、运算符等。
  • $obj = new myObject(10);你为什么通过(10)?
  • @Tomas 这就是您想在示例中使用的魔法 10 ($variable = 10)。类是你在 Javascript 中没有的东西,所以你不能遵循同样的想法。
  • 谢谢,我现在明白了,这里用 10 代替了 $variable 正确的 public function __construct($variable)
  • @Tomas 是的,就是传递给构造函数方法的值。
【解决方案2】:

具体来说,您询问了如何在 PHP 中使用全局变量。为此,您将在定义变量时使用 global 关键字:

$variable = 10;

class myObject {
    function foo () {
        global $variable;
        $username = $variable + 5 ;
        $zzz = $username + 5;
    }
}

但不要!这是个坏主意。这样做违反了对象封装的每一项原则,并且每次运行代码时都会杀死一只小狗。好吧,也许小狗是安全的,但这仍然不是一个好主意。

相反,您应该通过构造函数或访问器方法将值传递给对象。见下文:

// The following code is guaranteed not to kill any puppies
class myObject {

    private $_variable;
    private $_userName;
    private $_zzz;

    public function __construct($value) {
        $this->_variable = $value;
        $this->_userName = $this->_variable + 5;
        $this->_zzz = $this->_userName + 5;
    }

}

$variable = 10;
$obj = new myObject($variable);

【讨论】:

  • 在您的第一个示例中,global 应该没有效果(除非文件包含在函数中的某处)。它通常在函数内部使用。并且表达式不能在属性声明中使用。
  • 感谢您指出这一点。我会解决的。
  • 一定要删除vars——我猜$this需要被使用。
  • 我把变量拿出来了。您可以使用 $this 使所有内容成为对象的属性,但我试图说明的一点是它可以通过全局来完成,但实际上可能不应该这样做。第二个例子是我会倾向于的。感谢您的反馈!
  • 现在看起来很棒,让我点赞。
【解决方案3】:

您可以在对象中包含几种类型的变量静态和非静态,但也可以是公共的、私有的受保护的。我不会详细介绍,但这里有一个例子:

class MyClass 
{
   public $test = 'non-static';
   public static $otherTest = 'static';
   private $privateTest = 'private';
   const CONSTANT_TEST = 'constant';

   public function someMethod() {
       echo $this->$test; // non-static
       echo self::$otherTest; // static
       echo static::$otherTest; // static
       echo $this->privateTest; // private
   }

   public static staticMethod() {
       echo $this->test; // error
       echo self::$otherTest; // static
       echo static::$otherTest; // static
   }
}

$obj = new MyClass;
echo $obj->test; // non-static
echo $obj::otherTest; // static
echo MyClass::otherTest; // static
echo $obj->privateTest; // error
echo $obj::CONSTANT_TEST; // constant
echo MyClass::CONSTANT_TEST; // constant

【讨论】:

    【解决方案4】:

    因为你是在课堂之外访问它的变量,我相信这就是你想要实现的目标

    class myObject {
        public $username;
        public $zzz;
    }
    
    $variable = 10;
    $obj = new myObject();
    $obj->username = $variable + 5;
    $obj->zzz = $obj->username + 5;
    

    或者你可以拥有

    class MyObject {
        private $username;
        private $zzz;
    
        public function increment($variable) {
            $this->username = $variable + 5;
            $this->zzz = $this->username + 5;
        }
    }
    
    $variable = 10;
    $obj = new MyObject();
    $obj->increment($variable); // First Call
    $obj->increment(5); // Canbe called multiple times 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-15
      • 1970-01-01
      • 2015-08-30
      • 2015-08-19
      • 1970-01-01
      • 2019-08-26
      • 2012-08-09
      相关资源
      最近更新 更多