Hallo allemaal,

Ik worstel een beetje met het volgende. Ik heb een klasse Ticket. In deze klasse staan een aantal velden met de bijbehorende getters & setters. Zo staat er ook een veld genaamd priority. Dit veld mag alleen de waarde hebben van 1 van de 3 static variabelen in deze klasse $PRIORITY_LOW, $PRIORITY_MEDIUM of $PRIORITY_HIGH. Alleen als ik deze variabelen in de setter gebruik krijg ik de volgende fout:
Fatal error: Undefined class constant 'priority_low' in C:\wamp\www\RoyalPink\index.php on line 20

terwijl naar mijn idee de vatiabele wel defined is.
hieronder de code voor een beter zicht

Ticket.php

<?php

/**
 * @author Bert Sinnema
 * @project RoyalPink 
 * @copyright 2008
 * @description Ticket class
 */

	class Ticket{
		
		private  $className = "Ticket";
		
		static $PRIORITY_LOW = 1;
		static $PRIORITY_MEDIUM = 2;
		static $PRIORITY_HIGH = 3;
		
		private $id;
		private $title;
		private $description;
		private static $priority = 1;
		private $date;
		private $time;
		private $customer;
		
		
			function getId() {
				return $this->id; }
			
			function setId($id) {
				$this->id = $id; }
				
			function getTitle() {
				return $this->title; }
			
			function setTitle($title){
				$this->title = $title;					}
				
			function getDescription(){
				return $this->description;				}
			
			function setDescription($description){
				$this->description = $description;		}						
			
			static function getPriority(){
				return $this->priority;					}
			
			static function setPriority($priority){
				$this->priority = $priority;			}		
			
			function getDate(){
				return $this->date;		}
			
			function setDate($date){
				$this->date = $date;		}		
			
			function getTime(){
				return $this->time;		}
			
			function setTime($time){
				$this->time = $time;		}
				
			function getCustomer(){
				return $this->customer;		}
			
			function setCustomer($customer){
				$this->customer = $customer;		}				
						
			function getClassName(){
				return $this->className;
			}
			
			function printObject(){
				print($this->className ."(" . $this->id . ")". ": " . $this->title . " | " . $this->description . " | " . $this->priority  );
			}
	}

?>



En de test.php


<?php

/**
 * @author Bert Sinnema
 * @project RoyalPink 
 * @copyright 2008
 * @description Test
 */

include("model\Ticket.php");

$ticket1 = new Ticket();
$ticket1->setId(10);
$ticket1->setTitle("Test ticket");
$ticket1->setDescription("Blaat");
$ticket1->setPriority(Ticket::PRIORITY_HIGH);

$ticket1->printObject();



?>
Jij maakt static variabele aan terwijl het constanten moeten zijn. Zo dus:
<?php
class Ticket
{
const PRIORITY_LOW = 1;
...
}
?>
Iritant dat omschakelen van j2se naar php.

Werkt goed, dankjewel!!
Let even op dat static in PHP betekent dat je de method alleen buiten zijn context kan aanroepen. Het is eigenlijk niets meer dan een functie met de classname in z'n naam die toegang heeft tot private & protected methods van instanties van de klasse waar hij in zit. Maar $this is niet beschikbaar en static methods en variabelen zijn gedeeld over alle instanties van de klasse. Je priority() doet volgens mij niet wat jij in gedachten had.

Daarbij 'hoor' je in PHP bij alle methods te definieren of ze public, private of protected zijn. En je kan types afdwingen, iets dat je waarschijnlijk wel prettig vindt aangezien je Java achtergrond:
<?php
public function setCustomer(Customer $customer) {
$this->customer = $customer;
}
?>
Zo gaat PHP zeuren (met fatale fouten gooien) wanneer setCustomer als eerste argument niet een instantie van de klasse Customer krijgt.
Cewl.... thnQ de termen zijn me bekend en inderdaad fijn dat je kan afdwingen.. Tis wel ff wennen omdat het een en ander net ff anders is in de syntax.. Bedankt!!
Kun je ook met array,s doen:
<?php
public function setCustomer(array $customer) {
$this->customer = $customer;
}
?>

Meer niet dacht ik.
Static functies zijn ook intern aan te roepen! alleen hebben static functies geen toegang tot private, protected en public vars.

Daarnaast kun je constanten alleen benaderen via self::[varnaam];

en niet via $this->[varnaam];
Kun je net zoals in Java een return type afdwingen?

bijv

public Ticket getTicket(){
}

??
Nee, verder dan klasse/array afdwingen als argument gaat PHP niet. Je kan ook niet de standaard-typen als int, boolean etc afdwingen.

Statics hebben overigens wel toegang tot de private scope, ze zitten immers in dezelfde klasse. Dit maakt Singleton mogelijk:
<?php
class Zon {
public static function instance()
{
static $instance;
return $instance ? $instance = new self() : $instance;
}

private function __construct()
{
kan alleen via Zon::instance() verkregen worden, want is private
}
}

$zon = new Zon(); // geeft fout;
$zon = Zon::instance(); // gaat prima
?>

die static $instance is trouwens ook een truucje in PHP. Op deze manier is deze variabele 1 en dezelfde in alle aanroepen van Zon::instance, en behoudt hij zijn waarde. Deze manier is ook wel bekend:
<?php
class Maan
static protected $instance;

static public function instance()
{
if(!self::$instance) {
self::$instance = new self();
}

return self::$instance;
}

protected function __construct()
{

}
}
?>
Je kan het nog iets verder optimaliseren:

<?php
if(!self::$instance instanceof self) {
self::$instance = new self();
}
?>

Reageren