• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Array wird in Class nicht erkannt

  • Ersteller Gelöschtes Mitglied 3007
  • Erstellt am
Status
Für weitere Antworten geschlossen.
G

Gelöschtes Mitglied 3007

Guest
Guten Tag,

ich habe das problem das eine Variable in meiner Classe nicht als Array erkannt wird, obwohl ich sie im Constructor als array definiert habe.

Hier der Code

PHP:
<?php

interface iReg
{
	public function __construct();
	public function __get($name);
	public function __set($name, $value);
}

class reg implements iReg
{
	protected $_registry;
	
	public function __construct()
	{
		$this->_registry = array();
		$this->_registry['test'] = 'test';
	}
	
	public function __get($name)
	{
		/*
		if($name == '_registry')
		{
			return $this->_registry;
		}
		*/
		
		if (!empty($name) && array_key_exists($name, $this->_registry)) // Zeile 29
		{
			return $this->_registry[$name];
		}
		else
		{
			return null;
		}
	}
	
	public function __set($name, $value)
	{
		if($name == '_registry')
		{
			die('Sie dürfen die Interne Datenbank nicht überschreiben!');
		}
		
		$this->_registry[$name] = $value;
	}
}

?>

Die variable "test" habe ich nur definiert, damit ich testen kann ob alles so funktioniert wie gewollt...

Mit dem auskommentierten habe ich geguckt ob bei der frage nach $this-_registry vielleicht schon die __get funktion ausgelöst wurde. wird sie aber nicht...

Der Fehler lautet

Code:
Warning: array_key_exists() [function.array-key-exists]: The second argument should be either an array or an object in C:\daten\www\mvc\class\reg.class.php on line 29

die klasse variable "text" wird übrigens in einer anderen Klasse volgendermaßen abgefragt

PHP:
<?php

interface iTpl
{
	public function __construct();
}

class tpl  extends reg implements iTpl
{
	public function __construct()
	{
		echo $this->test;
	}
}

?>

MFG Miah
 
Werbung:
Um hier mal ein wenig schwung reinzubringen.

Wird bei "extends" eine neue instanz der Klasse erstellt und sollte ich die die reg Klasse vielleicht lieber als Referenz übergeben?

Und wie schon beschrieben das alte problem mit dem Array ^^
 
Extends erstellt keine neue Instanz. Eine Instanz ist ein Objekt einer Klasse. Bei extends erweiterst du nur die Klasse oder anders gesagt, du importierst ("wie mit include bei Seiten") die eine Klasse und schreibst sie dann weiter.

Also Bildlich so

Elternklasse {
_method1();
_method2();
_method3();


_methoda();
_methodb();
_methodc();
}
(Das Fettmarkierte hast du praktisch mit extends "importiert" <- Ja heißt nicht so, aber wie soll ich es sonst erklären?! ;))


Objekte sind Konkrete Dinge, sie werden dadurch ausgezeichnet, dass sie spezifische Attributwerte besitzen. Eine Klasse dagegen ist nur Abstrakt, d.h. sie ist der "Bauplan" für dein Objekt, ohne Attributwerte. Wenn du eine Klasse vererbst bleibt sie immernoch ohne Attributwerte, d.h. du erweiterst sie, sie ist aber kein Objekt / Instanz.

Was das Problem mit der Vererbung ist, ist, dass der Konstruktor der Super- / Elternklasse nicht aufgerufen wird. Du überschreibst ihn nämlich mit dem __construct der Klasse die die andere Klasse erbt.

Aussehen muss es dann also so
PHP:
<?php
class tpl  extends reg implements iTpl
{
    public function __construct()
    {
        parent::__construct();
        echo $this->test;
    }
}
?>

Woran das mit dem Array hapert, hm, gute Frage.
Bau doch mal überall nen var_dump() hin.
 
Werbung:
Ah dann wird das mit dem Array daran hapern, dass der Construktor in der Klasse "reg" nicht ausgeführt wird ^^ vielen dank :)

werde es so ändern das die klasse als referenz übergeben wird :)

//Edit: Ok hab schon wieder ein problem ^^

Ich habe die Klasse Reg als Verbindung zwischen den einzelnen Klassen gedacht um mir ein wenig schreib arbeit im Constructor zu spaaren aber wo ich jetzt erst dran denke ist, das wenn ich in einer klasse (nennen wir sie "test") eine referenz auf die klasse "reg" erstelle und in "test" nun eine kopie von sich selbst in "reg" erstellen lasse dann kommt es natürlich zur rekursion...

dieses habe ich erst bei einem var_dump() gemerkt hab aber keinen geschwindigkeitsverlust bemerkt.

Code:
object(tpl)#2 (1) {
  ["reg:private"]=>
  object(reg)#1 (1) {
    ["_registry:private"]=>
    array(1) {
      ["tpl"]=>
      object(tpl)#2 (1) {
        ["reg:private"]=>
        object(reg)#1 (1) {
          ["_registry:private"]=>
          array(1) {
            ["tpl"]=>
            *RECURSION*
          }
        }
      }
    }
  }
}

habe es versucht mir einer referenz zu erstellen da kommt es aber natürlich zum überlauf und ich bekomme einen Fehler.

meine frage ist nun, da ich die klasse "test" nicht als referenz übergeben konnte sondern nur als kopie ($this->reg->test = $this;), habe ich trotsdem noch zugriff auf alle variablen und funktionen der Klasse? oder kennt vielleicht sogar jemand eine bessere Methode dieses zu bewerkstelligen, außer jede einzelne klasse im construktor zu referenzieren?
 
Zuletzt bearbeitet von einem Moderator:
parent::__construct();

hab noch was nettes:
1
PHP:
<?php
namespace foo;

    class bar
    {
        public function __construct()
        {
            echo 'Vater';
        }
    }

    
?>
2
PHP:
<?php
namespace foo2;

require('gultigkeit.php6');

class bar extends foo::bar
{
    public function __construct()
    {
            echo 'Kind';
    }
}

class barw extends foo::bar
{
    
}



$bar = new ::foo::bar(); // vater

$bar2 = new bar(); // kind
$bar2 = new ::foo2::bar(); // kind

$bar3 = new barw(); // vater
?>


----
du ahst du schnell ein neues problem gepostet, ich denke es ist ein designfehler.
poste bitte mal alles.
 
Klassen erstellen
Code:
$reg = new reg;
$tpl = new tpl($reg);

reg Klasse
PHP:
<?php

interface iReg
{
	public function __construct();
	public function __get($name);
	public function __set($name, $value);
}

class reg implements iReg
{
	private $_registry;
	
	public function __construct()
	{
		$this->_registry = array();
	}
	
	public function __get($name)
	{
		if (!empty($name) && array_key_exists($name, $this->_registry))
		{
			return $this->_registry[$name];
		}
		else
		{
			return null;
		}
	}
	
	public function __set($name, $value)
	{
		if($name == '_registry')
		{
			die('Sie dürfen die Interne Datenbank nicht überschreiben!');
		}
		
		$this->_registry[$name] = $value;
	}
}

?>

tpl Klasse
PHP:
interface iTpl
{
	public function __construct(&$reg);
}

class tpl implements iTpl
{
	private $reg;
	
	public function __construct(&$reg)
	{
		$this->reg = $reg;
		$this->reg->tpl = $this;
	}
}

in der tpl Klasse habe cih es auch schon mit einer referenz auf sich selbst versucht also

PHP:
	public function __construct(&$reg)
	{
		$this->reg = $reg;
		$this->reg->tpl =& $this;
	}

Dieses geht aber logischerweise nicht da die Variable dadurch unendlich wachsen würde ^^

//Edit: Sollten die namespace sachen nicht erst in PHP 5.3 kommen? ^^ Bastel nähmlich auf PHP 5.1 basis ^^
 
Zuletzt bearbeitet von einem Moderator:
Werbung:
Status
Für weitere Antworten geschlossen.
Zurück
Oben