2011-03-04 25 views
5

tengo una clase llamada de contacto:PHP Clase Nombre de propiedad

class contacts 
{ 
    public $ID; 
    public $Name; 
    public $Email; 
    public $PhoneNumber; 
    public $CellPhone; 
    public $IsDealer; 
    public $DealerID; 
} 

En algún momento de mi código me gustaría señalar a una propiedad dentro de esa clase y devolver el nombre de la propiedad.

<input type="text" 
    id="<?php key($objContact->Name)" ?>" 
    name="<?php key($objContact->Name)" ?>" 
    value="<?php $_POST['contact'.key($objContact->Name)]" /> 

Mi problema es que la función key() solo se ocupa de matrices u objetos. $ objContact-> Name no cumple con estos requisitos. Sé que sería igual de simple escribir el nombre en los campos de ID y NOMBRE, pero esto es para otros usos de verificación de código. Imagine la página de procesador:

$objContact = new contact(); 

$objContact->Email = $_POST[$objContact->Email->**GetSinglePropertyName()**]; 

$objContact->PhoneNumber = $_POST[$objContact->PhoneNumber->**GetSinglePropertyName()**]; 

Esto permite que encienda estricto y garantizar que como estoy escribiendo No estoy creación de cualquier error de dedo de grasa en el camino que van a tenerme abollar la cabeza más de lo actualmente existe.

ACTUALIZACIÓN CON RESPUESTA respuesta proporcionada por: linepogl

Ahora he tomado la idea de linepogl y extendido es cierta para que pueda trabajar muy fácilmente con mi base de código existente. Esto es lo que he llegado con:

class baseData { 
    public $meta; 

    public function __construct() { 
     $this->meta = new Meta($this); 
    } 
} 

class Meta { 
    public function __construct($obj) { 
    $a = get_object_vars($obj); 
    foreach ($a as $key => $value){ 
     $this->$key = $key; 
    } 
    } 
} 

class contacts extends baseData 
{ 
    public $ID; 
    public $Name; 
    public $Email; 
    public $PhoneNumber; 
    public $CellPhone; 
    public $IsDealer; 
    public $DealerID; 
} 

que significa que ahora puedo llamar al siguiente código con los resultados deseados:

$objContact = new contacts(); 
echo($objContact->meta->Email); 
+1

estoy teniendo un tiempo difícil averiguar lo que quiere lograr. Como un solo objeto es solo eso: un solo objeto, ¿cómo tendría la clave del puntero actual algún significado? ¿Qué quiere hacer con la llave, por qué y cómo debe tener sentido para su objeto? – Nanne

+0

No se puede obtener el 'nombre' de una variable a partir de una variable. Sin embargo, puede obtener todos los nombres de propiedades de un objeto usando 'get_object_vars' – Petah

+0

haciendo un foreach en su objeto podría ayudarlo, no perfecto, pero es bueno para empezar – Tsadiq

Respuesta

6

lo tanto, desea al escribir $objContact->Name tomar como no una respuesta a la evaluación de esta expresión, pero sus metadatos, que en este caso es un objeto ReflectionProperty.

Lo que quiere es una función que se llama metaprogramación (http://en.wikipedia.org/wiki/Metaprogramming). Por supuesto, php no es compatible con eso, pero hay otros lenguajes que sí lo hacen, como Lisp, etc. Los rumores dicen que C# 5.0 introducirá esas características.

Puede lograr un efecto similar al usar Reflection (http://php.net/manual/en/book.reflection.php). Puede obtener el metaobjeto de $objContact (ReflectionClass) e iterar sobre las propiedades.

Por lo tanto, no hay forma de identificar una propiedad específica con un identificador. La única forma de hacerlo es con una cadena de su nombre.

EDIT:

Sin embargo, hay una manera de simularlo! Escribir una clase como esta:

class Meta { 
    public function __construct($obj) { 
    $a = get_object_vars($obj); 
    foreach ($a as $key => $value){ 
     $this->$key = $key; // <-- this can be enhanced to store an 
          //  object with a whole bunch of meta-data, 
          //  but you get the idea. 
    } 
    } 
} 

Así que ahora usted será capaz de hacer esto:

$meta = new Meta($objContact); 

echo $meta->Name; // <-- with will return 'Name'! 
+0

No era la respuesta que quería, pero parecía plausiblemente correcta. He buscado en ReflectionObject de PHP y hasta ahora no he encontrado exactamente cómo podría ser utilizado con éxito. No ayuda que las funciones que me gustaría investigar no estén documentadas en php.net. – Jeff

+0

Mi única razón para estar molesto es que no puedo votar más de una vez por esa respuesta. ¡GENIO! Empecé a tratar de idear una idea similar dentro de la clase pero fallé miserablemente. Esto funcionará muy bien y se puede integrar muy bien como una clase base para heredar, por lo que puedo hacer algo más en la línea de $ objContact-> Meta-> Name; – Jeff

0

La función key() funciona muy bien con los objetos. Simplemente no logra lo que aparentemente intentas hacer.

$c = new contacts; 
end($c); 
print key($c); // "DealerID" 

Puede foreach sobre atributos de los objetos, y PHP recuerda la última accede key(). Pero no estoy seguro si esto es lo que quieres.

+0

Eso está muy cerca, excepto cuando escribo el valor de la clave en el campo ENTRADA, no necesariamente accederé al campo antes, así que esto no funcionará. – Jeff

+1

@Jeff: lo he vuelto a leer. El quid de su pregunta es 'Me gustaría señalar una propiedad'. Supongo que simplemente desea generar una lista de atributos como formulario. Si es así, tendrás que iterar sobre las attribues de todos modos 'foreach ($ contact as $ key => $ value)' y allí está tu puntero. Puede hacer '$ object -> $ key' y simplemente usar' $ key' para generar los campos . – mario

+0

¿Está sugiriendo construir los campos INPUT dentro de la instrucción foreach? ¿O es una sugerencia construir una matriz de $ claves a las que se pueda hacer referencia más adelante? – Jeff

2

Puede utilizar get_object_vars() así:

$properties = get_object_vars($objContact); 
foreach($properties as $name => $value) 
{ 
    if($value == $objContact->Name) 
    { 
     //here's youre name 
    } 
} 

pero con ello, tendrá que asumir que objContact- $> Nombre tiene un valor único sobre todas las propiedades ...

0

Como se ha mencionado por konforce, ¿es esto lo que estás buscando?

$var = 'Name'; 
$Obj->$var;//Obj's Name property 
... 
id="<?php $var ?>" //id="Name" 
... 
$_POST['contact'.$var];//$_POST['contactName'] 
+0

Sí - no exactamente. El uso de variables variables aún deja la posibilidad de hacer referencia a un elemento dentro de la clase que realmente no existe. Podría hacer $ var = 'sillytalk'; $ obj -> $ var y el valor es nulo cuando se usa en otro lugar porque la propiedad de 'sillytalk' no existe. – Jeff

+0

@Jeff, puede usar '$ foo = new ReflectionProperty ('contacts', $ var)' para verificar si '$ var' contiene un nombre de propiedad válido para la clase' contacts'. Lanzará una excepción (atrapable) si no lo hace. – Matthew

Cuestiones relacionadas