PHP: цепочка вызовов методов

Возможный дубликат:
цепочка методов PHP?

Иногда я вижу, что некоторые php-приложения используют такие классы:

$Obj = new Obj();
$Obj->selectFile('datafile.ext')->getDATA();

Пример выше получает содержимое выбранного файла, а затем возвращает его (просто пример);

Ну, прежде чем я решил спросить вас, как я могу это сделать, я попробовал это:

class Someclass {
    public function selectFile( $filename  ) { 
       $callAclass = new AnotherClass( $filename );
       return $callAclass;
    }

    // Other functions ...
}

class AnotherClass {
    protected $file_name;

    public function __construct ( $filename ) { $this->file_name = $filename; }
    public function getDATA ( ) {
        $data = file_get_contents( $this->file_name );
        return $data;

    } 

    // funcs , funcs, funcs ....

}

Это правильный способ выполнить эту задачу? И, пожалуйста, скажите мне, как называются эти классы.


person Innogen    schedule 20.02.2012    source источник
comment
Google для method chaining in php. По сути, вы просто возвращаете $this в цепочном методе :) Хотя пример просто вводит в заблуждение, выбор файла, вероятно, является просто factory для создания другого объекта на основе контекста (в этом имени имя файла). Итак, если метод возвращает объект любого типа, вы можете связать его.   -  person Bartosz Grzybowski    schedule 21.02.2012
comment
Пожалуйста, воздержитесь от использования смайликов, интернет-сленга и жирного текста здесь при переполнении стека. Также не забудьте прочитать FAQ.   -  person Richard J. Ross III    schedule 21.02.2012
comment
Мне нравится термин «крушение поезда».   -  person phpmeh    schedule 21.02.2012


Ответы (2)


Это называется цепочкой методов. Взгляните на этот вопрос на SO.

Вот как вы можете сделать то, чего пытаетесь достичь:

class File 
{
    protected $_fileName;

    public function selectFile($filename) 
    { 
        $this->_fileName = $filename; 
        return $this;
    }

    public function getData()
    {
        return file_get_contents($this->_fileName);
    }
}


$file = new File();
echo $file->selectFile('hello.txt')->getData();

Обратите внимание, что мы возвращаем $this в selectFile, это позволяет нам связать с ним другой метод.

person Flukey    schedule 20.02.2012
comment
поэтому я должен был просто вернуть сам Object! Большое спасибо ! ты такой щедрый! Будь здоров :) - person Innogen; 21.02.2012

Приведенный выше пример (первый) называется цепочкой. Вот обычный класс:

class a_class
{

    public function method_a()
    {
        echo 'method a';
    }

    public function method_b()
    {
        echo ' - method b';
    }

}

Вы бы назвали их так:

$class = new a_class();

$class->method_a();
$class->method_b();

Что будет повторять «метод a - метод b». Теперь, чтобы связать их, вы должны вернуть объект в методах:

class a_class
{

    public function method_a()
    {
        echo 'method a';
        return $this;
    }

    public function method_b()
    {
        echo ' - method b';
        return $this;
    }

}

Вы бы назвали их так:

$class = new a_class();

$class->method_a()->method_b();

Что также будет повторять «метод a - метод b».

Хотя я вернул объект в последнем методе - вам это строго не нужно, только предыдущие методы требуют этого для цепочки.

person BenOfTheNorth    schedule 20.02.2012
comment
Итак, ключ в том, чтобы вернуть сам объект! большое спасибо ! - person Innogen; 21.02.2012