访问类定义之外的变量和方法

时间:2009-09-12 16:57:49

标签: php

假设我有以下几行的php文件:

<?php
function abc() {  }

$foo = 'bar';

class SomeClass {  }
?>

abc()内使用$fooSomeClass时,我需要做些什么吗?我正在考虑在函数中使用global来访问函数外部定义的变量。

(我是PHP的OOP新手)

6 个答案:

答案 0 :(得分:27)

任何类外的函数都是全局的,可以从任何地方调用。与变量相同..只记得使用全局变量......

e.g

<?php
function abc() {  }

$foo = 'bar';

class SomeClass {  
 public function tada(){
     global $foo;

     abc();
     echo 'foo and '.$foo;
 }
}
?>

答案 1 :(得分:11)

只需通过构造函数将变量传递给对象实例,或者在需要时将其传递给方法,并记住不要使用全局! ANYWHERE!

为什么要避免global

  

针对全局变量的观点是它们非常紧密地耦合代码。您的整个代码库依赖于a)变量名$ config和b)该变量的存在。如果要重命名变量(无论出于何种原因),则必须在整个代码库中的任何位置执行此操作。您也不能再使用依赖于变量的任何代码。 https://stackoverflow.com/a/12446305/1238574

您可以在任何地方使用abc()因为PHP函数可以全局访问。

<?php
function abc() {  }

$foo = 'bar';

class SomeClass {
    private $foo;
    public function __construct($foo) {
        $this->foo = $foo;
    }
    public function doSomething() {
        abc($this->foo);
    }
}

class OtherClass {
    public function doSomethingWithFoo($foo) {
        abc($foo);
    }
}

$obj = new SomeClass($foo); // voillea

// or

$obj2 = new OtherClass();
$obj2->doSomethingWithFoo($foo);

答案 2 :(得分:2)

功能在全球范围内定义;所以,你不需要做任何事情来从你的班级方法中使用它们。

有关更多信息,请参阅function page in the manual,其中说明(引用):

  

PHP中的所有函数和类都有   全球范围 - 可以调用它们   在功能之外,即使它们是   内部定义,反之亦然。


另一方面,对于$foo变量,您必须在要访问它的每个方法/函数中使用global关键字。

有关更多信息,请不要犹豫,阅读有关Variable scope的页面,该页面应为您提供有趣的信息; - )


评论后编辑:

  

每种方法/功能无论如何   是否在课堂上定义?

如果在一个类中定义了“函数”,它就不再被称为“函数”,即使它仍然是使用的function:它被称为“方法”

方法可以静态使用:

MyClass::myMethod();

或动态:

$obj = new MyClass();
$obj->myMethod();

取决于它们是否定义为static


作为旁注:如果您不熟悉PHP中的OOP,那么您应该花一些时间阅读本手册的Classes and Objects (PHP 5)部分:它将解释得很多。

答案 3 :(得分:-1)

如果在

之前调用,则函数和变量都可以在类内部调用
<?php
    function abc() {
        $ba = 'Hello';
        return $ba;
    }

$bar = 'World';

class foo {

    public function __construct() {
        global $bar;
        $body = abc();
        $bod = $bar;

        echo $body.$bod;
    }
}

$foo = new foo();
$foo;

答案 4 :(得分:-1)

  <?php    
  class Foo {
  public static $my_static = 'foo';

   public function staticValue() 
    {
     return self::$my_static;
     }
  }
  print Foo::$my_static."\n";//Accessing variables outside of class definitions
  $foo = new Foo();

  print $foo->staticValue()."\n";
  ?>    

答案 5 :(得分:-2)

尝试创建一个调用$ foo并设置类似

的变量的新类
class SomeClass {  
 public function tada(){
     $foo = new Class;
     $foo = $foo->getFoo;
 }
}