Как получить значение из объекта PHP?

114
03 марта 2022, 15:40

Получаю следующий объект:

    Bitrix\Tasks\Item\Result Object
    (
        [instance:protected] => Bitrix\Tasks\Item\Task Object
            (
                [id:protected] => 443904
                [userId:protected] => 0
                [transitionState:protected] => Bitrix\Tasks\Item\State Object
                    (
                        [isInside:protected] =>
                        [result:protected] => Bitrix\Tasks\Item\Result Object
                            (
                                [instance:protected] =>
                                [errors:protected] => Bitrix\Tasks\Util\Error\Collection Object
                                    (
                                        [fatalCount:protected] => 0
                                        [values:protected] => Array
                                            (
                                            )
                                    )
                                [data:protected] =>
                            )
                        [time:protected] => 0
                        [mode:protected] => 1
                        [parameters:protected] =>
                        [values:protected] => Array
                            (
                            )
                    ) 
...

Как мне из него получить значение 443904?

Answer 1

Мой вариант, если битрикс таки не оборачивают:

class CustomTask extends Bitrix\Tasks\Item\Task
{
    public function getTaskId()
    {
        return $this->id;
    }
}

И уже вызывать CustomTask

Answer 2

Чтобы получить информацию о создании задачи достаточно вызвать метод getData после создания задачи.

Пример:

$task = new \Bitrix\Tasks\Item\Task(0, 1);
$task->save();
$taskResult = $task->getData();
Answer 3

В общем у меня получилось добраться к id через защищённые свойства, но думаю есть более простой способ, кто знает прошу написать. Вот мой вариант:

class A{
    protected $b;
    public function __construct(B $b){
        $this->b = $b;
    }
}
class B{
    protected $id = 43243;
}

$a = new A(new B);
$reflectionClass = new ReflectionClass('A');
$reflectionProperty = $reflectionClass->getProperty('b');
$reflectionProperty->setAccessible(true);
$bClass = $reflectionProperty->getValue($a);
$reflectionClass = new ReflectionClass($bClass);
$reflectionProperty = $reflectionClass->getProperty('id');
$reflectionProperty->setAccessible(true);
print_r($reflectionProperty->getValue($bClass));

Сначала я сделал доступным свойство класса A и затем уже взялся за id Структура такая же как и у вас, вам стоит только заменить переменные

Answer 4

Если посмотреть все методы объекта, то увидим, что нет метода для получения id. Поэтому единственный вариант, кроме расширения класса Битрикс, использовать зеркальный класс:

function accessProtected($obj, $prop) {
  $reflection = new \ReflectionClass($obj);
  $property = $reflection->getProperty($prop);
  $property->setAccessible(true);
  return $property->getValue($obj);
}

Еще один недостаток - вложенность свойств, поэтому эту функцию придется вызвать дважды:

$inst = self::accessProtected($result, 'instance');
$id = self::accessProtected($inst, 'id');

Но использовать такой метод в Production можно только после профайлинга. А если нужно более изящное решения, то нужно искать реализацию подобных задач в исходных кодах самого Битрикс:

bash: grep -r 'Bitrix\Tasks\Item\Task' /path/to/bitrix/
Answer 5

Пришлось решить вопрос через init.php, там отследить событие создания задачи. Как раз и возвращается id.

READ ALSO
Почему в PHP !== возможно, а !=== не бывает?

Почему в PHP !== возможно, а !=== не бывает?

Потому, что логическая конструкция ! работает только с приведенными типами?

102
Проверка формы перед отправкой или отправка формы без проверки PHP?

Проверка формы перед отправкой или отправка формы без проверки PHP?

я изучаю PHPМне интересно решать задачи по средствам PHP, HTML и CSS, поэтому прошу не предлагать решения по средствам JS, AJAX

79
Где искать log файл в структуре bitrix?

Где искать log файл в структуре bitrix?

Вылезла ошибка 500Пытаюсь освоить bitrix

74
curl command в php скрипт

curl command в php скрипт

Подскажите пожалуйста

105