2015-01-04 3 views
0

Хорошо, допустим, у меня есть строка с именем test, и я знаю, что эта строка фактически используется как имя свойства в одном из моих классов. Есть ли способ узнать, какой класс имеет имя с именем test?Проверьте, к какому классу принадлежит свойство PHP

Что-то вроде этого, может быть:

class Foobar { 
    private $foo; 
} 

class Bazbar { 
    private $test; 
} 

$attr_name = 'test'; 
echo get_class_name_by_attr($attr_name); // Would output Bazbar 

Быстро импровизированный этот код ...

Есть ли способ для достижения этой цели в PHP?

+0

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

+0

Почему вы определяете '$ test'' private'? Я не думаю, что это сработает. –

+0

Что сказал Марк Бейкер: http://php.net/manual/en/function.get-declared-classes.php + http://php.net/manual/en/book.reflection.php –

ответ

3

Я согласен с теми людьми, которые считают, что вам нужно переанализировать вашу проблему. Но ответ на вопросе что-то вроде этого:

foreach (get_declared_classes() as $class) { 
    if (property_exists($class, 'test')) { 
     echo $class. " has the propriety test.\n"; 
    } 
} 
0

Это должно работать для вас:

(я до сих пор спрашиваю себя, почему вам это нужно, но я надеюсь, что это помогает)

<?php 

    class Foobar { 
     private $foo; 
    } 

    class Bazbar { 
     private $test; 
    } 


    $attr_name = "test"; 
    $check_classes = array("Foobar", "Bazbar"); 

    foreach($check_classes as $k => $v) { 
     $obj = new $v(); 
     $obj = new ReflectionClass($obj); 
     $classes[] = $obj->getProperties(ReflectionProperty::IS_PUBLIC | ReflectionProperty::IS_PROTECTED | ReflectionProperty::IS_PRIVATE); 
    } 

    foreach($classes as $class) { 
     foreach($class as $prop) { 

      if($prop->getName() == $attr_name) 
       echo "Class: " . $class[0]->class. " Prop: " . $prop->getName(); 

     } 
    } 

?> 

Выход:

Class: Bazbar Prop: test 

Здесь я добавлен массив, поиск которого в этих классах формирует attr. имя. Для этого я использую Reflection. Вы можете прочитать об этом здесь: http://uk.php.net/manual/en/book.reflection.php

+1

Почему не что-то вроде 'foreach (get_declared_classes() как $ class) {if (property_exists ($ class, 'test')) {echo $ class. "имеет test prop \ n"; }} '? – Federkun

+0

@Leggendario lol, не думал об этом, вы абсолютно правы, вы можете написать ответ, если хотите! – Rizier123

Смежные вопросы