Dynamiczne pole uzależnione od innego pola w klasia

0

Cześć!

Mam klasę i w niej takie pole: public $keyID = 'id';

W innej metodzie chcę uzyskać wartość tego pola, bo jest od tej wartości uzależniona nazwa innego pola i pobieram go tak: $this->{$this->keyID} ale otrzymuję pusty string.

Tworząc ten obiekt ta wartość nie jest ustawiana przez metodę, tylko na sztywno jest wpisana w kodzie.

Jak pobrać wartość dynamicznego pola o nazwie z pola z $keyID?

0

To jest możliwe, ale najpierw wytłumacz nam w jakim celu potrzebujesz takich sztuczek - być może masz błąd projektowy.

0

Napisałem sobie taki mini ORM i tam chcę ustawić primaryKey, żeby potem móc wiązać po ID inne elementy, wyszukiwać rekordy. A w tabelach w bazie mam kolumny po których chcę wiązać z różnymi nazwami.q

0

Ach, w takiej sytuacji faktycznie jest to uzasadnione, pozwalam ;-)

http://ideone.com/RnYG9l

<?php
 
abstract class AbstractEntity {
 
	public $primaryKey;
 
	public function getPrimaryKeyValue() {
		$primaryKeyName = $this->primaryKey;
		return $this->$primaryKeyName;
	}
 
}
 
class MyEntity
	extends AbstractEntity {
 
	public $primaryKey = 'id';
 
	public $id;
 
}
 
$entity = new MyEntity();
$entity->id = 11092001;
 
echo $entity->getPrimaryKeyValue();
0

No i elegancko, działa! Dziękuję! :) A czy to abstract jest konieczne?

0

A czy powinna móc istnieć instancja abstrakcyjnej encji? Raczej niezbyt, bo i nie ma czego ona reprezentować.

W ogóle to imho lepiej pójść w takim kierunku:

<?php

interface EntityContract {

	public function getPrimaryKeyName();
	public function getPrimaryKeyValue();
	
}

abstract class AbstractEntity
	implements EntityContract {

	public function getPrimaryKeyValue() {
		$primaryKeyName = $this->getPrimaryKeyName();
		return $this->$primaryKeyName;
	}
	
}

class UserEntity
	extends AbstractEntity {
	
	protected $id;
	
	public function getPrimaryKeyName() {
		return 'id';
	}
	
}

I potem wszędzie, gdzie chcesz operować na encjach (np. zapisywać je do bazy), przyjmuj EntityContract.

1 użytkowników online, w tym zalogowanych: 0, gości: 1