2011-02-02 4 views
6

Я пытаюсь узнать ООП и я сделал этот классPHP - передача переменных классов

class boo{ 

    function boo(&another_class, $some_normal_variable){ 
    $some_normal_variable = $another_class->do_something(); 
    } 

    function do_stuff(){ 
    // how can I access '$another_class' and '$some_normal_variable' here? 
    return $another_class->get($some_normal_variable); 
    } 

} 

и я называю это где-то внутри another_class класса как

$bla = new boo($bla, $foo); 
echo $bla->do_stuff(); 

Но я не знать, как получить доступ к $ bla, $ foo внутри функции do_stuff

+5

* (ссылочные) * [Классы и объекты Основы] (HTTP: // WWW .php.net/manual/en/language.oop5.basic.php) – Gordon

+0

Читайте о '$ this' на http://docs.php.net/this! – rik

ответ

12
<?php 
class Boo 
{ 

    private $bar; 

    public function setBar($value) 
    { 
     $this->bar = $value; 
    } 

    public function getValue() 
    { 
     return $this->bar; 
    } 

} 

$x = new Boo(); 
$x->setBar(15); 
print 'Value of bar: ' . $x->getValue() . PHP_EOL; 

Просьба не передавать по ссылке в PHP 5, в этом нет необходимости, и я читал, что это на самом деле медленнее.

Я объявил переменную в классе, хотя вам этого не нужно.

+0

Как @Logan сказал - Нижняя строка - это если вы хотите сохранить некоторую информацию - тогда вам нужно сохранить ее в локальном классе. – Mikhail

+4

Я бы не сделал заявление на одеяло «не передавайте по ссылке в PHP5». Может быть, не для композиции, но что, если вы хотите изменить массив на месте? Передача по ссылке имеет свои преимущества. –

+0

, вы, вероятно, должны сказать: «для этого есть редко». В большинстве случаев это не нужно. – zzzzBov

3

В PHP конструкторы и деструкторы записываются со специальными именами (__construct() и __destruct(), соответственно). Доступ к переменным экземпляра экземпляра с использованием $this->. Вот переписывание вашего класса, чтобы использовать это:

class boo{ 

    function __construct(&another_class, $some_normal_variable){ 
    $this->another_class = $another_class; 
    $this->some_normal_variable = $another_class->do_something(); 
    } 

    function do_stuff(){ 
    // how can I access '$another_class' and '$some_normal_variable' here? 
    return $this->another_class->get($this->some_normal_variable); 
    } 

} 
+0

«Для обратной совместимости, если PHP 5 не может найти функцию __construct() для данного класса, он будет искать функцию-конструктор старого стиля по имени класса. Фактически это означает, что единственный случай, который имел бы проблемы совместимости - это если класс имел метод с именем __construct(), который использовался для различной семантики. " - [Конструкторы и деструкторы PHP] (http://www.php.net/manual/en/language.oop5.decon.php). Использование нового синтаксиса по-прежнему является хорошей идеей, поскольку обратная совместимость может быть снижена в будущем. – zzzzBov

+0

@zzzzBov, я бы никогда не сказал кому-то начать использовать то, что было устарело. ИМО этот стиль более ясен. –

+0

Я просто пытался добавить ясность относительно того, почему работает код Alexandra (для конструктора, который есть). – zzzzBov

9

Ok, во-первых, использовать новый конструктор стиля __construct вместо метода с именем класса.

class boo{ 

    public function __construct($another_class, $some_normal_variable){ 

Во-вторых, чтобы ответить на ваш конкретный вопрос, вам нужно использовать member variables/properties:

class boo { 
    protected $another_class = null; 
    protected $some_normal_variable = null; 

    public function __construct($another_class, $some_normal_variable){ 
     $this->another_class = $another_class; 
     $this->some_normal_variable = $some_normal_variable; 
    } 

    function do_stuff(){ 
     return $this->another_class->get($this->some_normal_variable); 
    } 
} 

Теперь заметим, что для переменных-членов внутри класса мы ссылаться на них, предваряя их с $this->. Это потому, что свойство связано с этим экземпляром класса. Это то, что вы ищете ...

1

Вы должны захватить значения в классе, используя $ это:

$this->foo = $some_normal_variable 
Смежные вопросы