Подтвердить что ты не робот

Доступ к переменным и методам вне определений классов

Предположим, что у меня есть файл php по этим строкам:

<?php
function abc() {  }

$foo = 'bar';

class SomeClass {  }
?>

Есть ли что-то особенное, что мне нужно сделать, чтобы использовать abc() и $foo внутри SomeClass? Я думаю по линиям использования global в функции для доступа к переменным, определенным вне функции.

(Я новичок в ООП в PHP)

4b9b3361

Ответ 1

Функции

вне любого класса являются глобальными и могут быть вызваны из любого места. То же самое с переменными.. просто не забудьте использовать глобальные переменные...

например

<?php
function abc() {  }

$foo = 'bar';

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

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

Ответ 2

Просто передайте переменную в экземпляр объекта через конструктор или передайте его методу, когда это необходимо, и не забудьте НЕ ИСПОЛЬЗОВАТЬ ГЛОБАЛЬНЫЙ! ВЕЗДЕ!

Почему global следует избегать?

Точка против глобальных переменных заключается в том, что они очень сильно сочетают код. Вся ваша база кода зависит от: a) имени переменной $config и b) существования этой переменной. Если вы хотите переименовать переменную (по какой-либо причине), вы должны делать это везде на всей вашей кодовой базе. Вы также не можете использовать какой-либо фрагмент кода, который зависит от переменной независимо от нее. fooobar.com/questions/136265/...

Вы можете использовать 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);

Ответ 3

Функции

определены на глобальном уровне; поэтому вам не нужно ничего делать, чтобы использовать их из метода вашего класса.

Для получения дополнительной информации см. страницу функций в руководстве, в которой указано (цитирование):

Все функции и классы в PHP имеют глобальный масштаб - их можно назвать вне функции, даже если они были определяется внутри и наоборот.


С другой стороны, для вашей переменной $foo вам необходимо использовать global ключевое слово внутри каждого метода/функции, в котором вы хотите для доступа к ней.

Для получения дополнительной информации, не стесняйтесь читать страницу Переменная область, которая должна предоставить вам интересные сведения; -)


Редактировать после комментария:

Каждый метод/функция независимо от него определяется в классе или нет?

Если в классе определена "функция", она больше не называется "функцией", даже если она все еще используется function: она называется "методом"

Способы могут использоваться статически:

MyClass::myMethod();

Или динамически:

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

В зависимости от того, были ли они определены как static или нет.


В качестве побочного элемента: если вы новичок в ООП в PHP, вы должны определенно потратить некоторое время на чтение Classes and Objects (PHP 5) руководства: он многое объяснит.

Ответ 4

Как функциональные, так и переменные cane вызывать внутри классов, если они вызываются до

<?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;

Ответ 5

Попробуйте создать новый класс, который вызывает $foo и задает переменную типа

class SomeClass {  
 public function tada(){
     $foo = new Class;
     $foo = $foo->getFoo;
 }
}

Ответ 6

  <?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";
  ?>