LINUX.ORG.RU

методы stdClass

 , ,


0

1

добрый день. сделала функцию

function obj() {
        $obj = new stdClass;
        $obj->set = function($data) {
            $this->data = $data;
            return $this;
        };
        $obj->get = function($data) {
            return $this;
        };
        return $obj;
}

Но почему то при вызове

$obj = obj()->set(1);

я получаю ошибку

Uncaught Error: Call to undefined method stdClass::set()

Подскажите как исправить?



Последнее исправление: jessgt (всего исправлений: 1)

class TmpCls {
    public function obj() {
        $obj = new stdClass;
        $obj->data = null;
        $obj->set = function($data) {
            $this->data = $data;
            return $this;
        };
        $obj->get = function($data) {
            return $this;
        };
        return $obj;
    }
}
$class = new TmpCls();
$obj = $class->obj();
$set = $obj->set;
$get = $obj->get;
$set(1);                                                                                                                                             
print_r($get);

Вот так вот получилось, но как сделать чтоб можно было вот так

$class = new TmpCls();
$obj = $class->obj();
$obj->set(1)->get();

jessgt
() автор топика

Просто stdClass не подойдёт, но объект расширить можно. Только зачем... Так и быть, решение этой странной фигни тут:

http://stackoverflow.com/questions/2938004/how-to-add-a-new-method-to-a-php-o... третий пример.

Если укоротить:

<?php

class AnObj extends stdClass
{
    public $data = null;
    public function __call($closure, $args)
    {
        return call_user_func_array($this->{$closure}->bindTo($this),$args);
    }

    public function __toString()
    {
        return call_user_func($this->{"__toString"}->bindTo($this));
    }
}

$a=new AnObj();
$a->set = function($data) {$this->data = $data; return $this;};
$a->get = function() {return $this->data;};

echo $a->set(12)->get();

Если по человеческий:

<?php

class A
{
  protected $data = null;

  public function set($data) {
    $this->data = $data;
    return $this;
  }

  public function get() {
    return $this->data;
  }
}

$a = new A();
echo $a->set(12)->get();
PHPFan
()
Ответ на: комментарий от jessgt

Вангую, что вы, сударь, приехали в PHP из JS и пытаетесь быдлокодить как умеете. То, что вы творите - сие есть хипстота, за которую линейкой по рукам бьют.

ThisNameWasFree
()
Ответ на: комментарий от jessgt

Не подскажите чем это плохо? я про код который выше

Я не он, но отвечу. Вообще-то, это ужасно. :) У PHP есть возможность «из коробки» использовать красивые классы, наследование, инкапсуляцию, по сравнению с которыми JS прототипирование просто выглядит жалко и не к месту, поэтому его никто и не использует. Хотя это и можно, да. Советую почитать:

http://ru.php.net/manual/ru/language.oop5.php

Изначальные предназначения этих языков их ихней объектной модели совсем другие. PHP - WEB аппликация (backend), JS - скрипт (frontend).

PHPFan
()
Ответ на: комментарий от PHPFan

Как то сложновато и непривычно выглядет ))) но почитаю. Спасибо.

А как в вашем примере выше сделать чтоб добавленная функция пропускалась в цикле?

Т.е. в цикле

foreach ($obj as $val){echo $val;}

Если в объекте есть добавленные мной функции set и get, то выскакивает ошибка

Recoverable fatal error:  Object of class Closure could not be converted to string

Смогла избавиться от этой ошибки такой проверкой в цикле

if(is_string($val))

Но есть ли способ чтоб циклом пропускались эти функции set и get оставив код цикла в таком варианте

foreach ($obj as $val){echo $val;}
Т.е. без проверок в нем?

jessgt
() автор топика
Ответ на: комментарий от jessgt

Завязывай с программированием и иди кричать «Свободная касса!»

anonymous
()
Ответ на: комментарий от PHPFan

ого, да куда ей итераторы

ТС, может тебе еще рано объекты? Начни лучше с массивов

kiotoze ★★★★
()

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

anonymous
()

Найди себе мужа IT'шника. Научись варить борщи и делать правильно...

Научись не пилить мозги, - вообще. Научись спокойно относиться к тому, что муж после работы любит отдыхать наедине с пару часиков. Научись любить и лелеять мужа.

А потом когда будут внуки и крепкая семья, можешь и за PHP браться!

istepan
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.