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

Ale*_*x S 14 php

假设我有这样一行的php文件:

<?php
function abc() {  }

$foo = 'bar';

class SomeClass {  }
?>
Run Code Online (Sandbox Code Playgroud)

我需要做些什么特别的使用abc()$foo内部SomeClass?我正在考虑global在函数中使用来访问函数外部定义的变量.

(我是PHP的OOP新手)

Vid*_*nes 28

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

例如

<?php
function abc() {  }

$foo = 'bar';

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

     abc();
     echo 'foo and '.$foo;
 }
}
?>
Run Code Online (Sandbox Code Playgroud)

  • 不要使用`global`!你应该避免它!请在下面找我的答案. (4认同)

brz*_*hal 12

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

为什么global要避免?

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

您可以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);
Run Code Online (Sandbox Code Playgroud)


Pas*_*TIN 3

功能是在全局级别定义的;因此,您无需执行任何操作即可从类的方法中使用它们。

有关更多信息,请参阅手册中的功能页面,其中指出(引用):

PHP 中的所有函数和类都具有全局作用域 - 即使它们是在函数内部定义的,也可以在函数外部调用它们,反之亦然。


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

有关更多信息,请随时阅读有关变量范围的页面,这应该会给您带来有趣的信息;-)


评论后编辑:

每个方法/函数无论是否在类中定义?

如果“函数”在类内部定义,则它不再被称为“函数”,即使它仍然是function使用的:它被称为“方法”

方法可以静态使用:

MyClass::myMethod();
Run Code Online (Sandbox Code Playgroud)

或者动态地:

$obj = new MyClass();
$obj->myMethod();
Run Code Online (Sandbox Code Playgroud)

取决于它们是否被定义为静态


旁注:如果您是 PHP 中的 OOP 新手,您绝对应该花一些时间阅读手册的类和对象 (PHP 5)部分:它将解释很多内容。