SELFPHP: Version 5.8.2 Befehlsreferenz - Tutorial – Kochbuch – Forum für PHP Einsteiger und professionelle Entwickler

SELFPHP


Professional CronJob-Service

Suche



CronJob-Service    
bei SELFPHP mit ...



 + minütlichen Aufrufen
 + eigenem Crontab Eintrag
 + unbegrenzten CronJobs
 + Statistiken
 + Beispielaufrufen
 + Control-Bereich

Führen Sie mit den CronJobs von SELFPHP zeitgesteuert Programme auf Ihrem Server aus. Weitere Infos



:: Buchempfehlung ::

Webseiten professionell erstellen

Webseiten professionell erstellen zur Buchempfehlung
 

:: Anbieterverzeichnis ::

Globale Branchen

Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP  

 

:: Newsletter ::

Abonnieren Sie hier den kostenlosen SELFPHP Newsletter!

Vorname: 
Name:
E-Mail:
 
 

Zurück   PHP Forum > SELFPHP > PHP Grundlagen

PHP Grundlagen Hier kann über grundlegende Probleme oder Anfängerschwierigkeiten diskutiert werden

Antwort
 
Themen-Optionen Ansicht
  #1  
Alt 19.05.2014, 23:56:08
Auf der Mauer Auf der Mauer ist offline
Anfänger
 
Registriert seit: Jun 2009
Alter: 42
Beiträge: 119
Rückgabewert einer Methode

Hallo,

ich habe mit folgendem Code mal etwas getestet.
Weiß aber nicht so recht warum es funktioniert, vielleicht kann mir hier ja jemand kurz was dazu sagen.

Die Methode gibt entweder eine Zahl oder false zurück, je nachdem welche Werte $x und $y haben.
Wenn eine Zahl zurückgegeben wird, dann wird wohl auch true zurückgegeben aber warum?

PHP-Code:
    /**
     *  Object oriented programming (OOP)
    **/
    
    
class myClass {
        function 
myFunction() {
        
            
$x 3$y 5;
            
            if (
$x $y) {
               
$val 1234567890;
            } else {
               
$val false;
            }
            return 
$val;
        }
    }
    
    
//--- create a new object
       
$obj = new myClass();
       
    
//--- test the function

    
if ($var $obj->myFunction()) {
          echo 
'return = Zahl';
    } else {
          echo 
'return = false';
    } 
Der Code hier ist nur exemplarisch, er erfüllt so keinen realen Zweck.
Wenn ich "return true" nutze dann kann ich mit if ($var = $obj->myFunction())
darauf prüfen. Meine Methode gibt aber entweder "1234567890" oder "false" zurück.
Trotzdem funktioniert die Überprüfung mit if, so als würde hier neben der Zahl auch
true zurückgegeben obwohl ich dieses nicht verwende.

Ich könnte ja auch folgendes schreiben.

PHP-Code:
$var $obj->myFunction(); 

if (
$var !== false) {
   
//--- continue code


# oder

if (is_numeric($var)) {
   
//--- continue code

Ich denke schon, dass es reichlich wirr geworden ist. ;)

Also ich nutze soetwas in einem Upload Script. Eine Methode liefert mir die aktuelle Bilderordner ID.
Also eine Zahl, da aber auch etwas bei der Ermittlung schief laufen kann, wird die Funktion dann mit
"false" abgebrochen. Dann werden auch keine Thumbnailbilder erstellt usw.

Beispiel:

PHP-Code:

if ($folderId $obj->findFolder) {
    
//--- create thumbs



Gruß
Auf der Mauer
Mit Zitat antworten
  #2  
Alt 20.05.2014, 07:02:34
Benutzerbild von meikel (†)
meikel (†) meikel (†) ist offline
SELFPHP Guru
 
Registriert seit: Dec 2003
Ort: Erfurt
Alter: 75
Beiträge: 4.001
AW: Rückgabewert einer Methode

Zitat:
Zitat von Auf der Mauer Beitrag anzeigen
PHP-Code:
    if ($var $obj->myFunction()) {
          echo 
'return = Zahl';
    } else {
          echo 
'return = false';
    } 
Das ist der Fehler. Der boolsche Wert einer Zuweisung ist immer wahr. Er würde nur dann false sein, wenn $obj->myFunction kein Objekt sondern false repräsentiert. Das ist aber nicht der Fall, weil es ein Objekt mit dem Wert false ist und nicht bool false.
PHP-Code:
    if (false !== ($var $obj->myFunction())) {
          echo 
'return = Zahl';
    } else {
          echo 
'return = false';
    } 
Hier fände die Prüfung des Wertes von $obj->myFunction() statt. $a = $b; ist grundsätzlich wahr, wenn $a beschreibbar ist.

Zwingend ist aber
PHP-Code:
if (false !== ($var $obj->myFunction())) { 
, weil die Bedingung
PHP-Code:
if (true === ($var $obj->myFunction())) { 
nicht möglich ist.
Deine Testklasse liefert nur
1234567890
oder
false
Die Zuweisung von
$var = 1234567890;
ist genauso wahr wie die Zuweisung von
$var = false;

btw: ein normaler Compiler oder Interpreter würde mit nem Fehler abbrechen, wenn der Wert einer If Verzweigung nicht vom Typ bool ist.
Mit Zitat antworten
  #3  
Alt 21.05.2014, 10:08:08
Auf der Mauer Auf der Mauer ist offline
Anfänger
 
Registriert seit: Jun 2009
Alter: 42
Beiträge: 119
AW: Rückgabewert einer Methode

Hallo meikel,

vielen Dank für deine Antwort!
Eine Fehlermeldung bekomme ich nicht.
Habe error_reporting auf E_ALL geschaltet.

Du hast Recht, es findet eine Zuweisung statt, deshalb true.
Wenn meine Funktion aber false zurück liefert dann nicht.

Es ging mir ja darum zu prüfen, ob eine Zahl zurückgegeben wurde
oder false.

PHP-Code:
if ($var $obj->myFunction()) {
      
/*
         code hier wird ausgeführt wenn die Funktion 
         eine Zahl zurück gibt   
     */
}

# oder

$var $obj->myFunction();

if (!empty(
$var)) {
      
/*
         code hier wird ausgeführt wenn die Funktion 
         eine Zahl zurück gibt   
     */
}

# oder

if (is_numeric($var)) {
      
/*
         code hier wird ausgeführt wenn die Funktion 
         eine Zahl zurück gibt   
     */

Irgendwie habe ich das mit Rückgabewert noch nicht verstanden.
Ich habe das auch benutzt bei einer Datenbankabfrage.
Der folgende Code soll nur ausgeführt werden, wenn die Datenbankabfrage erfolgreich war.

PHP-Code:

$sql 
"SELECT `col` FROM `table` WHERE `id` = '1'";

if (
$res $db->query($sql)) {
   
//--- wird nur ausgeführt wenn Datenbankabfrage erfolgreich war.
   
$count $res->num_rows;
} else {
   
//--- Fehler bei der Datenbankabfrage

Gruß
Auf der Mauer
Mit Zitat antworten
  #4  
Alt 21.05.2014, 12:25:37
Benutzerbild von meikel (†)
meikel (†) meikel (†) ist offline
SELFPHP Guru
 
Registriert seit: Dec 2003
Ort: Erfurt
Alter: 75
Beiträge: 4.001
AW: Rückgabewert einer Methode

Machs doch so:
PHP-Code:
<?php

class test {
  protected 
$a null;

  public function 
__construct(){
# irgendwas...
  
}

  public function 
istZahl{$a){
    return 
ctype_digit($a)
      ? 
$a
      
null;
  }

}

function 
ausgabe($x){
 if (
is_null($x)){
  echo 
$x ' ist keine Zahl.';
 }else{
  echo
$x ' ist eine Zahl.'
 
}
}

$t = new test();
ausgabe($t->istZahl('a'));
ausgabe($t->istZahl('123456');
?>
Mit Zitat antworten
  #5  
Alt 21.05.2014, 15:19:40
Auf der Mauer Auf der Mauer ist offline
Anfänger
 
Registriert seit: Jun 2009
Alter: 42
Beiträge: 119
AW: Rückgabewert einer Methode

Hallo Meikel,

es geht ja nicht so sehr darum zu übeprüfen ob eine Zahl zurückgegeben wird.
Da kann ich mir schon etwas basteln.

Meine Frage war, warum in meinem Beispiel von oben der Code dann ausgeführt wird
wenn eine Zahl zurückgegeben wird und der andere Teil bei false.

Du kannst dafür ja die Werte bei $x und $y mal vertauschen. Dann kommt was anderes raus.

Außerdem dachte ich an einen Rückgabewert von true bei gelingen einer Aktion zusätzlich
zur Wertzuweisung. Man sollte danach z.B. mit $result arbeiten können.

PHP-Code:

$sql 
"Abfrage";

if (
$res $db->query($sql)) {
  
//--- weiter
   
$count $res->num_rows;
} else {
  
//--- abbruch

Bei PHP.net fand ich z.B. folgenden Code.

PHP-Code:
$size getimagesize($filename);

if (
$size) {
    
header("Content-type: {$size['mime']}");
    exit;
} else {
    
// Fehler
}

# ist doch dasselbe als wenn ich folgendes schreibe.

if ($size getimagesize($filename)) {
    
//--- Grafikdatei
} else {
    
//--- Keine Grafikdatei

Wenn es sich um keine Grafikdatei handelt dann liefert getimagesize false.
Erlaubt man nur einen bestimmten Grafiktyp z.B. JPG, dann muss man das natürlich noch extra prüfen.

Gruß
Auf der Mauer
Mit Zitat antworten
  #6  
Alt 21.05.2014, 17:45:12
Benutzerbild von meikel (†)
meikel (†) meikel (†) ist offline
SELFPHP Guru
 
Registriert seit: Dec 2003
Ort: Erfurt
Alter: 75
Beiträge: 4.001
AW: Rückgabewert einer Methode

Zitat:
Zitat von Auf der Mauer Beitrag anzeigen
Meine Frage war, warum in meinem Beispiel von oben der Code dann ausgeführt wird wenn eine Zahl zurückgegeben wird und der andere Teil bei false.
Das ist eines der großen PHP Probleme: das automatische Typecasting.

Normalerweise dürfte
PHP-Code:
if ( $a $b) {


gar nicht funktionieren, weil die Zuweisung lade $a mit dem Inhalt von $b überhaupt keinen Returnwert haben kann und haben dürfte. Weiterhin müßte der Bedingungsterm nach dem IF auf ein boolsches Ergebnis bestehen oder streiken.

Die berühmte while Schleife, um die Ergebnisse einer SQL Abfrage abzuholen, ist eigentlich auch falsch:
while ($row = $db->fetch_assoc())

While führt den Block dann aus, wenn die Bedingung wahr ist. $row = irgend was ist aber theoretisch immer wahr, weil es eine Zuweisung und keine Bedingung ist. Und irgend wann mal (nach 3 Joints und 2 Flaschen Fusel) haben sich die PHP Götter darauf geeinigt, daß zumindest bei dem SQL Fetch und bei ein paar anderen Funktionen (KA, welche) ein false == 'hab nix mehr' durchgereicht wird, damit while abbricht.

Zitat:
Bei PHP.net fand ich z.B. folgenden Code.
PHP-Code:
$size getimagesize($filename);
if (
$size) {
    
header("Content-type: {$size['mime']}");
    exit;
} else {
    
// Fehler
}

# ist doch dasselbe als wenn ich folgendes schreibe.

if ($size getimagesize($filename)) {
    
//--- Grafikdatei
} else {
    
//--- Keine Grafikdatei

Wenn es sich um keine Grafikdatei handelt dann liefert getimagesize false.
Erlaubt man nur einen bestimmten Grafiktyp z.B. JPG, dann muss man das natürlich noch extra prüfen.
Sowas ist Pfui. Wenn das Script aufgerufen wird, weil es ein Bild ausgeben soll, dann muß es auch ein Bild liefern. Also irgend was mit content-type: image...
Sonst fühlt sich der Browser verarscht, wenn er bei <mg src="fehler.php"> kein Bild sondern Text kriegt.
Für solche Fälle sollte man sich ein nettest Bildchen basteln, welches, wenn das Script auf die Fresse fällt, stattdessen abgeschickt wird.
Und weil man ja keine Lust hat, das Bild als jpg, gif und png auf den Server zu packen, schickt man den Content-type Header erst dann ab, wenn man weiß, was man hat.
Notfalls kann man ja damit nachgucken:
http://mod.php.developer.vc/content-type_1/ (Quelltext wird angezeigt)
Mit Zitat antworten
  #7  
Alt 21.05.2014, 18:11:29
Auf der Mauer Auf der Mauer ist offline
Anfänger
 
Registriert seit: Jun 2009
Alter: 42
Beiträge: 119
AW: Rückgabewert einer Methode

Hallo Meikel,

ja das ist der Code von php.net
Benutze ich so nicht, es ging mir da mehr um den if Teil.

Wie du schon geschrieben hast findet so eine Zuweisung auch bei einer while Schleife statt.
Das ganze kommt mir wie eine Kurzschreibweise vor. Du hälst das wirklich für einen Fehler von PHP?

PHP-Code:
/* 
   Ist false wenn keine Bilddatei gewählt wurde 
   oder die Bilddaten nicht ermittelt werden konnten. 
*/

if ($size getimagesize($filename)) {  
    
//--- Grafikdatei
} else {
    
//--- Keine Grafikdatei

Auch folgendes habe ich schon gesehen.

PHP-Code:

$size 
getimagesize($filename)

if (
$size) {  
    
//--- Grafikdatei
} else {
    
//--- Keine Grafikdatei

So wie ich es verstehe:

$size ist bei gelungenem Funktionsaufruf nicht nur ein array mit den Bilddaten, sondert ist auch TRUE als Rückgabewert
der aufgerufenen Funktion getimagesize().Wenn aber keine Bilddatei gewählt wurde oder aus einem anderen Grund die
Bilddaten nicht ermittelt werden konnten, dann ist $size FALSE. Denn in diesem Fall wird der else Teil ausgeführt.

Gruß
Auf der Mauer
Mit Zitat antworten
  #8  
Alt 22.05.2014, 13:06:10
Benutzerbild von meikel (†)
meikel (†) meikel (†) ist offline
SELFPHP Guru
 
Registriert seit: Dec 2003
Ort: Erfurt
Alter: 75
Beiträge: 4.001
AW: Rückgabewert einer Methode

Zitat:
Zitat von Auf der Mauer Beitrag anzeigen
ja das ist der Code von php.net
Da is leider auch nicht alles Gold, was glänzt.

Normalerweise würde ich das mit ner Fallentscheidung klären:
http://de3.php.net/manual/en/function.getimagesize.php
http://de3.php.net/manual/en/image.constants.php

PHP-Code:
$info $filename;
switch(
$info[2]){
  case 
IMG_GIF:
  case 
IMG_JPG:
  case 
IMG_JPEG:
    
tuwas($filename;
  break;
  default:
    
fehlerbild_ausgeben();

Mit Zitat antworten
  #9  
Alt 22.05.2014, 13:57:03
Auf der Mauer Auf der Mauer ist offline
Anfänger
 
Registriert seit: Jun 2009
Alter: 42
Beiträge: 119
AW: Rückgabewert einer Methode

Zitat:
Zitat von meikel Beitrag anzeigen
Da is leider auch nicht alles Gold, was glänzt.
Das glaube ich sofort. ;)

Mit dem switch ist auch sehr gut gelöst.
Ich benutze dafür ein Array, dann kann ich die Scriptparamter bei Bedarf oben im Kopfbereich anpassen

PHP-Code:


   
/**
    *   Upload class
   **/ 
   
   
class upload {
   
   
//--- the allowed file types
       
private $fileTypes = array(IMG_JPGIMG_GIF);
       
   
/**
    *  other upload parameters ...
   **/    
       
       
private function checkFile($imgData) {
           if (
in_array($imgData[2], $this->fileTypes)) {
               
//--- file okay
           
} else {
               
//--- type is not allowed!
           
}
       }
       
   } 
Gruß
Auf der Mauer
Mit Zitat antworten
  #10  
Alt 22.05.2014, 14:18:43
Benutzerbild von meikel (†)
meikel (†) meikel (†) ist offline
SELFPHP Guru
 
Registriert seit: Dec 2003
Ort: Erfurt
Alter: 75
Beiträge: 4.001
AW: Rückgabewert einer Methode

Zitat:
Zitat von Auf der Mauer Beitrag anzeigen
Gruß
Auf der Mauer
Gruß zurück.

Du kannst ja auch mal testen, das objekt fileinfo zu überladen. Wollte Dir eigentlich ein Beispiel anbieten, war mir aber dann doch zu fummlig...

Hier ein Fragment:
PHP-Code:
class bildausgabe extends finfo{

    public function 
__construct(){
        
parent::__construct(FILEINFO_MIME_TYPE);
    }
    
    public function 
check($fn$fb){
        
$typ parent::file($fn);
        switch(
$typ){
            case 
'image/jpeg':
            case 
'image/gif':
            case 
'image/png':
            
header("Content-type: $typ");
        break;
        default: 
# Fehlerbild
            
$fn $fb;
            
$typ parent::file($fn);
            
header("Content-type: $typ");
        }
        
header('Content-Length: ' filesize($fn));
        
readfile($fn);
        exit;
    }

Mit Zitat antworten
Antwort


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind aus.
[IMG] Code ist aus.
HTML-Code ist aus.

Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Hintergrund methode PSK1 PHP Grundlagen 2 09.10.2009 13:27:50
PHP5 __destruct() -Methode wird nicht automatische aufgerufen ksticker PHP für Fortgeschrittene und Experten 4 17.05.2008 00:09:56
Variable an Methode übermitteln Socrates PHP Grundlagen 2 10.10.2007 22:22:06
Eine Funktion als Methode von verschiedenen Objekten FabianWesner PHP für Fortgeschrittene und Experten 0 07.08.2007 10:19:30
Meinung zu Methode Phil PHP für Fortgeschrittene und Experten 2 05.11.2004 19:16:57


Alle Zeitangaben in WEZ +2. Es ist jetzt 14:25:42 Uhr.


Powered by vBulletin® Version 3.8.3 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.


© 2001-2024 E-Mail SELFPHP OHG, info@selfphp.deImpressumKontakt