PHP:如何不使用全局变量?

时间:2014-01-27 19:33:57

标签: php

我有一个班级

Class MyClass{

    private $prop1;
    private $prop2; // this contains an array object

    public function __construct(){ }

    public function set_prop2($prop2)  
    {  
        $this->prop2= $prop2;  // value coming from other class that returns array object
    }

    public function func1()
    {
            global $prop1; 
            global $prop2;

        $var1 = // some value;
        $var2 = $prop1;
        $var3 = // some value;
        $obj = new SomeClass($prop2);
        $json = $obj->setVar2($var2)
                         ->someMethod($var1, $otherMethod)
                         ->method();


    } 

}

在方法内使用global属性,上面的类通过调用

为我工作
obj1 = new MyClass();
obj1->func1(); // I want to call it like this (without parameters)

我知道在方法中声明global并不是一件好事,但它是我使方法有效的唯一方法!

任何想法如何更好地使用语法,以便我可以调用不带obj1->func1();等参数的方法,我们非常感激。

注意:尝试声明为

$this->prop1;
$this->prop2;

但它为我提供Catchable fatal error: Argument 1 passed to...,因为如果使用$prop2

$this->prop2;未正确传递

3 个答案:

答案 0 :(得分:0)

Class MyClass{

    public $prop1;
    public $prop2; // this contains an array object

    public function __construct(){ }

    public function set_prop2($prop2)  
    {  
        $this->prop2= $prop2;  // value coming from other class that returns array object
    }

    public function func1()
    {

        $var1 = // some value;
        $var2 = $this->prop1;
        $var3 = // some value;
        $obj = new SomeClass($this->prop2);
        $json = $obj->setVar2($var2)
                         ->someMethod($var1, $otherMethod)
                         ->method();


    } 

}

答案 1 :(得分:0)

你在这里混淆了三件不同的事情:

    存在于任何函数,类或对象之外的
  • Global variables必须使用global关键字“导入”当前作用域。它们通常被认为是不好的做法,因为它们会导致代码“神奇地”将数据从一个地方传输到另一个地方,从而使重用,测试和调试变得更加困难。
  • Object propertiesclass定义中声明,属于该类的实例(对于static变量,属于类本身)。可以使用语法$object->property访问它们。 The private keyword表示变量只能在类中看到,通过使用特殊变量$this,意思是“我在里面的这个对象”,例如echo $this->prop1;
  • 调用函数时会传入
  • Function arguments。在函数内部,它们是具有函数定义中给出的名称的局部变量,因此不需要以任何方式导入或加前缀。对象方法基本上只是“附加到”特定对象的函数,并以相同的方式工作。

在您的示例中,您对此处的对象属性进行了评论...

 private $prop2; // this contains an array object

...但是你说使用那个变量($this->prop2)会给出一个错误(你还没有真正向我们展示过),这表明它是阵列。 (正如评论中所提到的,“数组对象”是一个奇怪的单词选择。我现在假设你只是意味着“数组”。)

然后使用全局变量 ...

“解决”这个问题
global $prop2;
$obj = new SomeClass($prop2);

... 一个完全不同的变量

您还会显示设置私有财产的方法的定义......

public function set_prop2($prop2)

...但你从来没有告诉我们你在哪里打电话。

你已经注释了一条评论建议你在哪里认为它被称为......

// value coming from other class that returns array object

...但整个问题取决于函数参数的来源。


使代码难以阅读的一个原因是对象属性,全局变量和函数参数都具有相同的名称。这不会使它们成为同一个变量。

您可以尝试分离出不同的变量,并依次查看每个变量:

class MyClass {
    private $private_property;

    public function set_prop2($new_value_for_prop2) {  
        var_dump($new_value_for_prop2); // what's the value passed in?

        $this->private_property = $new_value_for_prop2;
    }

    public function func1() {
        var_dump($this->private_property); // what value is it now?
    } 
}

$function_return = some_function();
var_dump($function_return); // is it an array?

$obj = new MyClass;
$obj->set_prop2($function_return); // should show you the value being set

$obj->func1(); // should show the same value again

答案 2 :(得分:-1)

你可以使用会话功能,但我不确定这对安全性是个好主意......取决于参数的关键...

<?php
Class MyClass{

    private $prop1;
    private $prop2; // this contains an array object

    public function __construct(){ }

    public function set_prop2($prop2)  
    {  
        $this->prop2= $prop2;  // value coming from other class that returns array object
    }

    private function func1()
    {
        $prop1 = $_SESSION['prop1']; 
        $prop2 = $_SESSION['prop2'];

        $var1 = // some value;
        $var2 = $prop1;
        $var3 = // some value;
        $obj = new SomeClass($prop2);
        $json = $obj->setVar2($var2)
                     ->someMethod($var1, $otherMethod)
                     ->method();
    }

}
?>

致电:

<?php
session_start();
$_SESSION['prop1'] = $prop1;
$_SESSION['prop2'] = $prop2;
obj1 = new MyClass();
obj1->func1();
?>