Fenix

Конструкция типа $db->query($s)->fetchAll();

Recommended Posts

В ООП стал часто встречать конструкцию типо $db->query($s)->fetchAll(); или $this->load->model('blog');

Выглядит это очень красиво и удобочитаемо. И мне стало интересно как такое сделать. Кто нибудь знает тут как такое делается.

Share this post


Link to post
Share on other sites

а что тут не понятного , или вам скобки надо раставит для понимания очерёдности дейсвий?

Share this post


Link to post
Share on other sites
а что тут не понятного , или вам скобки надо раставит для понимания очерёдности дейсвий?

да

Share this post


Link to post
Share on other sites

методы возвращают идентификатор на себя.

class user{

private $password = '';
public $username = '';

function __construct( $username, $password )
{
$this->username = $username;
$this->password = $password;
}

function edit_username( $new_name = '' )
{
$this->username = $new_name;

return $this;
}

function display_username()
{
print $this->username;
}

}

$idx = new user('fenix', 'test');
print $idx->edit_username('fenix_2')->display_username();

Конечно пример не супер, но можешь всегда открыть сорцы моей системы и глянуть такие методы как:

$cmsp->addDatabase( $type_sql, $params = array(), $p_connect = false );

Этот метод вернет идентификатор нужного класса/базы.

$dbh = $cmsp->addDatabase( $type_sql, $params = array(), $p_connect = false )->connect();
print $dbh->version;

Share this post


Link to post
Share on other sites

Функция возвращает ссылку на свой же класс. Или указатель, я слабо понимаю терминологию, но более-менее понимаю суть ;)

Share this post


Link to post
Share on other sites
Я правильно поимаю, что вот это:

$this->load->model('blog');

то же самое, что и это:

$this->load;
$this->model('blog');

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

$this->load->model('blog')

$this->load->helper('form')

$this->load->library('benchmark')

Edited by Fenix

Share this post


Link to post
Share on other sites

С $this->load->model('blog') все просто

$this - это указатель на текущий класс, в методе которого можно увидеть такой код.

У этого класса есть переменная load, к которой можно обратиться как $this->load. Эта переменная является объектом какого-либо класса (напирмер Vasya). У этого класса есть метод model.

Получается, что $this->load->model('blog') вызов метода model класса Vasya, объект которого находится в переменной load текущего класса.

Вам стоит ознакомиться с объектно-ориентированной парадигмой, тогда все станет на свои места.

Share this post


Link to post
Share on other sites

Мда... Все очень запутано... Можешь поподробнее объяснить про переменную, которая является объектом какого-либо класса.

Share this post


Link to post
Share on other sites

Ща я попробую:

class SomeClass {
$somevar = new SomeOtherClass();

public function someMethod() {
$someData = 'some data';
return $someData;
}
}

class SomeOtherClass {
public function someOtherMethod() {
$someData = 'some data';
return $someData;
}
}

$obj = new SomeClass();
$SomeClass->somevar->someOtherMethod();

Вроде так если я правильно понял.

Share this post


Link to post
Share on other sites

А... Я кажется понял...

$this->load->model('blog')

$this->load - это переменая load этого класса которая содержит имя класса где есть функция model.

Например:

Если $this->load = "loading" то выполняется loading->model('blog'), так?

Edited by Fenix

Share this post


Link to post
Share on other sites

Ну походу она содержит не имя класса, а экземпляр класса, т.е. сам объект.

Только я не понимаю почему не записать так:

class SomeClass extends SomeOtherClass {
public function someMethod() {
$someData = 'some data';
return $someData;
}
}

class SomeOtherClass {
public function someOtherMethod() {
$someData = 'some data';
return $someData;
}
}

$obj = new SomeClass();
$SomeClass->someOtherMethod();

??? Знатоки, объясните я вообще прав или нет в своих рассуждениях? И почему нельзя сделать через extends?

Share this post


Link to post
Share on other sites
Ну походу она содержит не имя класса, а экземпляр класса, т.е. сам объект.

Только я не понимаю почему не записать так:

class SomeClass extends SomeOtherClass {
public function someMethod() {
$someData = 'some data';
return $someData;
}
}

class SomeOtherClass {
public function someOtherMethod() {
$someData = 'some data';
return $someData;
}
}

$obj = new SomeClass();
$SomeClass->someOtherMethod();

??? Знатоки, объясните я вообще прав или нет в своих рассуждениях? И почему нельзя сделать через extends?

Незнаю... Я сделал такие выводы посмотрев на этот код:

$page_controler = new $controller();
$page_controler -> $action();

Share this post


Link to post
Share on other sites

class SomeClass {
$somevar = new SomeOtherClass();

Это что? ;)

@fenix, контроллер пишется с двумя ll, controller — регулятор, управляющее устройство

Share this post


Link to post
Share on other sites
И почему нельзя сделать через extends?

Потому что содержать объект, который имеет определенное сосотояние и наследовать функциональность класса разные вещи и применяется в разных случаях.

Советую по этому поводу почитать вот эту книгу http://www.ozon.ru/context/detail/id/3905587/

Share this post


Link to post
Share on other sites
@fenix, контроллер пишется с двумя ll, controller — регулятор, управляющее устройство

знаю

Час пришел со школы и решил почитать "умную" книжку. Случайно открываю главу про юнит-тесты и вижу код:

class ValidatorTest extends PHPUnit_Framework_TestCase{
//...
public function testValidate_FalsePass(){
$store = $this -> getMock("UserStore");
$this -> validator = new Validator($store);
$this -> validator -> validateUser("bob@example.com", "wrong");
}
//...
}

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Member Statistics

    46,434
    Total Members
    3,128
    Most Online
    Sterben
    Newest Member
    Sterben
    Joined
  • Recently Browsing   0 members

    No registered users viewing this page.

  • Спрашивают сейчас

  • Пишут сейчас

    • Если свойства нет в спецификации, то откуда его возьмет браузер? Даже если в каком то одном из браузеров введут это свойство то смысла его использовать все-равно не будет, так как в остальных оно работать не будет 🙂   Тогда бардак творился, DHTML, разные объектные модели и все дела. У netscape действительно была такая фича. Хотя не факт что она работала. Вот тут https://www.uv.es/jordi/v3/html/dynhtml/dynamic.pdf можно увидеть что float:center; присутствует в коде, но следом написано что элементы можно выровнять с помощью float слева или справа, или с помощью js по центру. Также в книге указаны допустимые значения для float - left, right, none. Так что это скорее всего была запланированная возможность, которая не получила реализации.
    • Если бы с html и css, все браузеры строго соответствовали спецификациям) Да статье около десятка лет, а то и более. Вот я тоже склоняюсь к тому, что это ошибка. но эта лекция была написана даже с учётом ещё живого на тот момент netscape navigator. Может быть он позволял интерпретировать такую конструкцию. В описании автор указывает, что так блок становится обтекаемым с двух сторон.
    • Может с clear путаете? Или в статье спутали. Наверно, древняя?
      http://htmlbook.ru/css/clear
  • Popular Contributors