PHP обращение к методу по значению переменной в качестве имени

DV
На сайте с 01.05.2010
Offline
644
1390

Вот это

if (isset($user->field_responsible_for['und'])) {
Хочу заменить на

if (isset($user-><сюда переменную>['und'])) {

Если её тупо вставить, получаем Illegal string offset.

Мне не надо, чтобы переменная содержала метод, мне надо просто механически менять имена.

К примеру, было так

if (isset($user->field_responsible_for['und'])) {
а стало так:

if (isset($user->field_myfield['und'])) {
VDS хостинг ( http://clck.ru/0u97l ) Нет нерешаемых задач ( https://searchengines.guru/ru/forum/806725 ) | Перенос сайтов на Drupal 7 с любых CMS. ( https://searchengines.guru/ru/forum/531842/page6#comment_10504844 )
danforth
На сайте с 18.12.2015
Offline
153
#1

Вам нужно подготовить имя метода для вызова, и положить его в переменную, а потом вызвать через фигурные скобки. Короткий сниппет и полный листинг ниже.


$method_name = ucfirst('age');
$callable = "get{$method_name}";

var_dump($user->{$callable}());


<?php
namespace Demo;

class User
{

protected $name = 'John';
protected $age = 23;

public function getName() : string
{
return $this->name;
}

public function getAge() : int
{
return $this->age;
}


}

$user = new \Demo\User;

$method_name = ucfirst('age');
$callable = "get{$method_name}";

var_dump($user->{$callable}());
Junior Web Developer
Ragnarok
На сайте с 25.06.2010
Offline
239
#2

DenisVS, есть ещё

call_user_func, которому можно скормить переменную.

насчёт вызова метода объекта (или статического класса) -- я гуглил, на stackoverflow были решения того и того

//TODO: перестать откладывать на потом
R
На сайте с 20.02.2015
Offline
59
#3

Если правильно вас понимаю, http://php.net/manual/ru/language.variables.variable.php

MK
На сайте с 18.08.2005
Offline
126
#4

Вероятно, $user-><сюда переменную> не массив, поэтому варнинг. Попробуйте сначала проверить, что это массив

(is_array($user-><сюда переменную>)
нет
W
На сайте с 09.04.2013
Offline
46
#5

Если я правильно потнял задачу ,то вот


<?php
class User implements ArrayAccess
{
public $field_responsible_for = ['und'=>'123'];
private $field_myfield = ['und'=>'321'];


public function offsetGet($offset)
{
return $this->$offset;
}

public function offsetSet($offset, $value)
{
}

public function offsetExists($offset)
{
}

public function offsetUnset($offset)
{
}

}
$user = new User;
print_r($user->field_responsible_for['und'].PHP_EOL);
$field="field_responsible_for";
print_r($user[$field]['und'].PHP_EOL);
$field="field_myfield";
print_r($user[$field]['und']) ;
DV
На сайте с 01.05.2010
Offline
644
#6

Всем спасибо, буду разбираться на досуге.

R
На сайте с 20.02.2015
Offline
59
#7
DenisVS:
Всем спасибо, буду разбираться на досуге.

Там же все очень просто.. я уже давал ссылку выше.

Если свойство класса массив и надо получить доступ к индексу - $obj->{$<переменная>}[индекс]

пример:

class foo {

var $var1 = 1;
var $var2 = "str";
var $var3 = array('key1' => 'val1', 'key2' => 'val2');
}
$obj = new foo();
var_dump($obj);
foreach (array('var1', 'var2', 'var3', 'not_exists') as $property) {
if (property_exists($obj, $property)) {
// set
switch (true) {
case is_int($obj->$property): $obj->$property += 1000; break;
case is_string($obj->$property): $obj->$property .= "_set"; break;
case is_array($obj->$property): {
foreach ($obj->$property as $key => $value)
$obj->{$property}[$key] = $value."_set"; // к array надо так обращаться - $obj->{$<переменная>}[ключ]
}
break;
}
}
}
var_dump($obj);

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий