Archief - [PROG][PHP5] Typecasten naar zelfgedefinieerde klasse

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

BMF|Johan

Legacy Member
Ik heb een "oerklasse" clsAgendaItem, en daarvan zijn clsAgendaEenmalig en clsAgendaHerhaling twee afgeleide klassen.
Nu heb ik een array van eenmalige en herhalende agenda-items. Methods van clsAgendaItem kan ik zonder problemen gebruiken, maar ik kan niet aan methods die enkel in clsAgendaHerhaling zitten. PHP geeft dan een fatal error: "undefined method".

Volgens http://be.php.net/manual/en/language.types.type-juggling.php#language.types.typecasting kan je enkel typecasten naar integer, boolean,... en het te algemene "object". Hoe kan ik casten naar de klasse clsAgendaHerhaling? Of is er een andere manier om een method die specifiek voor die klasse is te benaderen?

Cakeman

Legacy Member
Het lijkt me dat je hier polymorfisme dient te gebruiken. Of PHP5 dat ondersteunt weet ik echter niet.

BMF|Johan

Legacy Member
Yup, polymorfisme. Maar dan is het toch de taak van PHP of de parser of whatever om de juiste klasse te achterhalen en daarin dan de juiste method te vinden. Maar dat doet die dus niet :(
Door typecasting kan je een hint geven van welke klasse hij moet gebruiken, maar dit gaat blijkbaar niet... Dus zoek ik een oplossing om alsnog elk object aan de juiste klasse te kunnen koppelen...

Tyfius

Legacy Member
Hier werkt het polymorfisme zonder probleem bij m'n Users. (adminuser, regularuser, ...)

killgore

Legacy Member
kheb gisteren nog een systeem geschreven dat van polyformisme gebruik maakt zoals jij het beschrijft en dat werkt hier perfect ze :s.

edit: geef eens de definities van je klassen :).

passero

Legacy Member
mij bij werkt dit ook perfect hoor.
Zeker dat je PHP5 gebruikt ;)

BMF|Johan

Legacy Member
PHP 5.1.4 om precies te zijn, passero.

De volledige code is nog iets gecompliceerder dan hoe ik het uitgelegd heb, aangezien er dag-, week-, maand- en jaarherhalingen zijn die allemaal ervan van clsHerhalingAgendaData, telkens classes in mijn Data-layer
PHP:
Mijn klassedefinites: 
<?php
require_once("clsDataBase.php");
include("agendafuncties.php");
class clsAgendaItemData{
...
	protected $m_dDatum;
...	
	protected $m_bHerhaling;
	
	function __construct(){
		
	}
	
	//SETTERS
...
	//GETTERS:
...	
	function getHerhaling(){
		return $this->m_bHerhaling;
	}
...
}

class clsAgendaEenmaligData extends clsAgendaItemData{
	function __construct(){
		parent::__construct();
		$m_bHerhaling = false;
	}
}

class clsAgendaHerhalingData extends clsAgendaItemData{
	protected $m_bGepauzeerd;
	protected $m_sHerhalingstermijn; //dag, week, maand, jaar
	
	function __construct(){
		parent::__construct();
		$m_bHerhaling = true;
	}
...	
	function setHerhalingstermijn($p_sHerhalingstermijn){
		$this->m_sHerhalingstermijn = $p_sHerhalingstermijn;
		$this->m_bGewijzigd = true;
	}
...
	function getHerhalingstermijn(){
		return $this->m_sHerhalingstermijn;
	}
}

class clsAgendaElkeDagData extends clsAgendaHerhalingData{
...
}

class clsAgendaElkeWeekData extends clsAgendaHerhalingData{
	protected $m_bEvenWeek;
	protected $m_bOnevenWeek;
	protected $m_nDagVanDeWeek;
	
	function __construct(){
		parent::__construct();
		$m_bEnkelWerkdag = true;
	}
	
...
	function setDagVanDeWeek($p_nDagVanDeWeek){
		$this->m_nDagVanDeWeek = $p_nDagVanDeWeek;
		$this->m_bGewijzigd = true;
	}
	
	function getDagVanDeWeek(){
		return $this->m_nDagVanDeWeek;
	}
}

class clsAgendaElkeMaandData extends clsAgendaHerhalingData{
...
}

class clsAgendaElkJaarData extends clsAgendaHerhalingData{
	protected $m_nMaand;
	protected $m_nDag;
}
?>
In een klasse clsAgenda worden al deze agenda-items bijgehouden, en als de agenda van een bepaalde dag wordt opgevraagd, worden de te tonen items in een array gestoken. Dit gebeurt in clsAgenda in mijn logic-layer.
PHP:
	function toonWeekAgenda($dag){
		$aToonWeekItems = array();
		$cnt=0;
		for($i=0; $i<$this->m_oAgenda->getAantalItems(); $i++){
			$AgendaItem = $this->m_oAgenda->getItem($i);
			//eenmalige activiteiten
			if($AgendaItem->getHerhaling() == false){
				//$AgendaItem->getDatum() == $dag
				$weertegevenweek = getWeekNummer($dag);
				$weekvanitem = getWeekNummer($AgendaItem->getDatum());
				if($weertegevenweek == $weekvanitem AND $AgendaItem->getToonWeek()){
					$aToonWeekItems[$cnt]=$AgendaItem;
					$cnt++;
				}
			}
			//herhalingen
			if($AgendaItem->getHerhaling() == true AND $AgendaItem->getToonWeek()){
				//iets dat elke dag plaatsvindt
				if($AgendaItem->getHerhalingstermijn() == "dag"){
					//is het iets dat enkel op weekdagen plaatsvind?
					if($AgendaItem->getEnkelWerkdag()==true){
						//is de weer te geven dag ook een werkdag?
						if(isWeekdag($dag)){
							$aToonWeekItems[$cnt]=$AgendaItem;
							$cnt++;
						}
					}else{
						//niet enkel op een werkdag, dus elke dag
						$aToonWeekItems[$cnt]=$AgendaItem;
						$cnt++;
					}
				}		
				//iets dat elke week plaatsvindt
				if($AgendaItem->getHerhalingstermijn() == "week"){
					//voor de activiteiten in even weken
					if($AgendaItem->getEvenWeek()==true){
						//activiteit op even week-dagen, maar is het ook een even week?
						if(getWeekNummer($dag)%2 == 0){
							//is dit een weekdag waarop het item getoond moet worden?
							if($AgendaItem->getDagVanDeWeek()==getDagNummer($dag)){
								$aToonWeekItems[$cnt]=$AgendaItem;
								$cnt++;
							}	
						}
					}
					//voor de activiteiten in oneven weken
					if($AgendaItem->getOnevenWeek()==true){
						//activiteit op oneven week-dagen, maar is het ook een even week?
						if(getWeekNummer($dag)%2 != 0){
							//is dit een weekdag waarop het item getoond moet worden?
							if($AgendaItem->getDagVanDeWeek()==getDagNummer($dag)){
								$aToonWeekItems[$cnt]=$AgendaItem;
								$cnt++;
							}	
						}
					}
				}
				//iets dat elke maand plaatsvindt
				if($AgendaItem->getHerhalingstermijn()=="maand"){
					if($AgendaItem->getDagVanDeMaand()==substr($dag, 8, 2)){
						$aToonWeekItems[$cnt]=$AgendaItem;
						$cnt++;
					}
				}
			}
		}
		usort($aToonWeekItems, "compareDatum");
		return $aToonWeekItems;
	}
De array die hier wordt teruggegeven wordt tot slot in de presentation-layer weergegeven:
PHP:
$v_aAgendaItems = $v_oAgenda->toonWeekAgenda($p_dDatum);
			$aantal = count($v_aAgendaItems);
			foreach($v_aAgendaItems as $AgendaItem){
				echo "<tr><td>";
				if($AgendaItem->getDatum() != null){
					echo substr(getDagVanDeWeek($AgendaItem->getDatum()), 0, 2) . " " . substr($AgendaItem->getDatum(), 8). "/" . substr($AgendaItem->getDatum(), 5, 2);
				}
				if($AgendaItem->getHerhaling() == "week"){
					//HIER LOOPT HET MIS :(
					//echo substr(getDagVanDeWeek($AgendaItem->getDatum()), 0, 2) . " " . substr($AgendaItem->getDatum(), 8). "/" . substr($AgendaItem->getDatum(), 5, 2);
					$weekdagen = array("Zondag", "Maandag", "Dinsdag", "Woensdag", "Donderdag", "Vrijdag", "Zaterdag");
					//$pom = ((clsAgendaElkeWeekData) $AgendaItem);
					//$pom->getDagVanDeWeek();
					//echo substr($weekdagen[$pom], 0, 2);
					//foutmelding bij echo $AgendaItem->getDagVanDeWeek();
					$pom = new clsAgendaElkeWeekData();
					$pom = $AgendaItem;
					echo $pom;
					echo $pom->getDagVanDeWeek();
				}
				echo "</td><td>";
				echo $AgendaItem->getOmschrijving();
				echo "</td></tr>"; 
			}
De foutmelding is:
Fatal error: Call to undefined method clsAgendaElkeDagData::getDagVanDeWeek() in C:\Program Files\xampplite\htdocs\Virtueel Kantoor\presentation\1-agenda.php on line 260
En die lijn 260 is:
echo $pom->getDagVanDeWeek();
Nu is die omweg via $pom = new clsAgendaElkeWeekData(); wel mijn recentste probeersel, de foutmelding was zonder die omweg juist hetzelfde :(

Zo... dat is het hele verhaal, hopelijk is het duidelijk genoeg :unsure:

BMF|Johan

Legacy Member
ZOMG :o
PHP:
	if($AgendaItem->getHerhaling()==true){
		if($AgendaItem->getHerhalingstermijn() == "week"){

in de presentation-layer en 't is opgelost. :applause:


Blijkbaar zelf wat verdwaald in de klassenboom, combinatie van denkfout en typo dus.
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan