我有一个班级
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;
未正确传递
答案 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
关键字“导入”当前作用域。它们通常被认为是不好的做法,因为它们会导致代码“神奇地”将数据从一个地方传输到另一个地方,从而使重用,测试和调试变得更加困难。class
定义中声明,属于该类的实例(对于static
变量,属于类本身)。可以使用语法$object->property
访问它们。 The private
keyword表示变量只能在类中看到,通过使用特殊变量$this
,意思是“我在里面的这个对象”,例如echo $this->prop1;
在您的示例中,您对此处的对象属性进行了评论...
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();
?>