johny7: Objekt oder Array erzeugen

Moin allerseits,

in einer Funktion verwende ich folgende Anweisung:

  
$return = (is_array($var)) ? array() : object();  

Beim Ausführen bekomme ich die Fehlermeldung:
Fatal error: Call to undefined function object() in /srv/www/htdocs/... in der betreffenden Zeile.

Warum? Kann ich denn nicht ein Objekt auf diese Art definieren?

Ich habe folgende Funktion:

  
//	Ersetzt 0-Werte durch einen Dummy, bearbeitet auch Arrays und Objekte  
function zero2dummy($var,$dummy='--')  
	{  
	if (is_array($var) || is_object($var))  
		{  
		$return = (is_array($var)) ? array() : object();  
		foreach ($var as $key=>$val)  
			{  
			if (is_array($var)) $return[$key] = zero2dummy($val,$dummy);  
			else $return->$key = zero2dummy($val,$dummy);  
			}  
		}  
	else  
		{  
		$return = (int) $var;  
		return ($return == 0) ? $dummy : $var;  
		}  
	}  

Grüße, JN

--
ie:{ fl:( br:^ va:| ls:[ fo:| rl:? n4:? ss:| de:] js:| ch:? sh:( mo:| zu:)
http://www.johny7.de
  1. Hi!

    Fatal error: Call to undefined function object() in /srv/www/htdocs/... in der betreffenden Zeile.
    Warum? Kann ich denn nicht ein Objekt auf diese Art definieren?

    Weil es in PHP keine Funktion namens object() gibt (solange du keine erstellst). Objekte instantiiert man auch von Klassen und nimmt dafür den new-Operator. Es gibt auch eine Klasse namens stdClass, von der man nackige Objekte instantiieren kann.

    Lo!

    1. Moin allerseits,

      Hi!

      Fatal error: Call to undefined function object() in /srv/www/htdocs/... in der betreffenden Zeile.
      Warum? Kann ich denn nicht ein Objekt auf diese Art definieren?

      Weil es in PHP keine Funktion namens object() gibt (solange du keine erstellst). Objekte instantiiert man auch von Klassen und nimmt dafür den new-Operator. Es gibt auch eine Klasse namens stdClass, von der man nackige Objekte instantiieren kann.

      Aha, also ~~~php

      $return = (is_array($var)) ? array() : new stdClass();

        
        
      Grüße, JN
      
      -- 
      ie:{ fl:( br:^ va:| ls:[ fo:| rl:? n4:? ss:| de:] js:| ch:? sh:( mo:| zu:)  
      http://www.johny7.de
      
      1. Hello,

        Aha, also

        $return = (is_array($var)) ? array() : new stdClass();

          
        Das interessiert mich jetzt doch, wofür Du das benötigst.  
          
        PHP arbeitet mit varianten Typen. Dadurch muss man immer Typ und Wert anschauen. Soweit hättest Du richtig gedacht. Aber wenn eine Funktion oder eine Methode ein FALSE zurückgibt, dann wird auch der Typ dabei auf boolean umgestellt. Der ursprüngliche geht also verloren.  
          
        Willst Du die Neuzuweisung des neutralen Elementses nebst Typ nun tatsächlich vom vorhandenen Typ abhängig machen, oder willst Du \_entscheiden\_ welchen Typ das neutrale Element hier anzunehmen hat? Dann müsstest Du nämlich besser eine Nachschlagetabelle mit den vorgeschriebenen Typen vorrätig halten.  
          
          
          
          
          
        Liebe Grüße aus dem schönen Oberharz  
          
          
        Tom vom Berg  
        ![](http://selfhtml.bitworks.de/Virencheck.gif)  
          
        
        -- 
         ☻\_  
        /▌  
        / \ Nur selber lernen macht schlau  
        <http://bergpost.annerschbarrich.de>
        
        1. Moin allerseits,

          ich habe meine Funktion jetzt etwas ergänzt. Die sieht jetzt folgendermaßen aus:

            
          //	Ersetzt 0-Werte durch einen Dummy, bearbeitet auch Arrays und Objekte; in $onlythis werden die indizes gespeichert, die ausschließlich bearbeitet werden  
          function zero2dummy($var,$dummy='--',$onlythis=false)  
          	{  
          	$return = $var;  
          	if (is_array($return) || is_object($return))  
          		{  
          		foreach ($return as $key=>$val)  
          			{  
          			if ($onlythis && !in_array($key,$onlythis)) continue 1;  
          			  
          			if (is_array($return)) $return[$key] = zero2dummy($val,$dummy);  
          			else $return->$key = zero2dummy($val,$dummy);  
          			}  
          		return $return;  
          		}  
          	else  
          		{  
          		$return = intval($return);  
          		return ($return == 0) ? $dummy : $return;  
          		}  
          	}  
          
          

          Wenn ich jetzt folgenden Aufruf durchführe:

            
          echo print_r($array1,1).'<br />';  
          $kopie = zero2dummy($array1,'--',array('geburtstag','eintrittsdatum','austrittsdatum'));  
          echo print_r($array1,1).'<br />';  
          echo print_r($kopie,1);  
          
          

          ist bei mir die zweite und dritte Ausgabe identisch. D.h., wenn ich einmal die Variable $array1 in der Funktion verwende, wird nicht bloß ein anderer Wert an die Variable davor zugewiesen, sondern der Original-Array wird auch verändert. Warum?
          Ich habe extra in der Funktion eine Kopie von der Eingehenden Variable angefertigt...

          Grüße, JN

          --
          ie:{ fl:( br:^ va:| ls:[ fo:| rl:? n4:? ss:| de:] js:| ch:? sh:( mo:| zu:)
          http://www.johny7.de
          1. Moin allerseits,

            echo print_r($array1,1).'<br />';
            $kopie = zero2dummy($array1,'--',array('geburtstag','eintrittsdatum','austrittsdatum'));
            echo print_r($array1,1).'<br />';
            echo print_r($kopie,1);

            Dasselbe passiert sogar, wenn ich folgende Anweisungen gebe:  
            ~~~php
              
            echo $array1;  
            $kopie = $array1;  
            zero2dummy($kopie,'--',array('geburtstag','eintrittsdatum','austrittsdatum'));  
            echo $array1.$kopie;  
            
            

            Das verstehe ich nicht. Jetzt wird sogar $array1 dann geändert, wenn es gar nicht beteiligt ist.

            Grüße, JN

            --
            ie:{ fl:( br:^ va:| ls:[ fo:| rl:? n4:? ss:| de:] js:| ch:? sh:( mo:| zu:)
            http://www.johny7.de