mijane Blog

ein paar interessante Sachen gibt es immer

Friend of a Friend

Geschrieben von Peter Rother • Samstag, 6. Juni 2009 • Kategorie: Klassen
Heute möchte ich euch eine kleine Klasse von mir vorstellen, die die Verbindung von einem User über Verbindungen zu anderen Usern bis zum gesuchten User erstellt. Diese Funktion ist manchen vielleicht von Xing oder anderen Netzwerken bekannt.


Da ich zuerst zu faul war die Klasse selber zu schreiben, habe ich gewartet bis jemand meinem Wunsch nachkommt und diese Klasse auf PHP hates me vorstellt. Dies ist dann auch durch den Beitrag von Ludwig Ruderstaller in dem Beitrag Six Degrees of Separation (friend of a friend) geschehen. Leider konnte ich, wie nach anfänglicher Euphorie festgestellt, die Klasse für das von mir benötigte nicht einsetzen. Der Dijkstra-Algorithmus ist, wie ich finde, hier fehl am Platz. Trotzdem einen Dank an den Entwickler der Klasse Ludwig Ruderstaller, denn wir wissen ja alle, wie viel Arbeit eine vernünftige Klasse manchmal machen kann.


Aber da ich die Klasse jetzt für das was ich benötige neu geschrieben habe, möchte ich euch diese jetzt auch vorstellen. Da ich immer noch keinen vernünftigen Syntax Highlighter installiert habe, könnt ihr euch die Klasse momentan nur als Text File ansehen. Die Klasse ist aus meinem aktuellen Projekt Pokerwelt24, welches in Kürze in die offene Beta Phase gehen wird. Die Klasse ist deshalb auch nicht als Stand Alone angepasst. Mit ein Paar kleinen Änderungen solltet ihr die Klasse auch auf eure Wünsche anpassen können.


Hier ein Auszug der Methoden die Standardmäßig nicht von der Klasse benötigt werden:


private function getUniqueRequiredUsers($aUserPaths)
private function removeNotRequiredLoadIds()
private function loadRequiredUsers()
private function regenerateUserList($aUserList)


Ich benötige diese Methoden, um die entsprechenden User Objekte zu generieren und diese meiner Liste zuzuweisen.
Natürlich braucht ihr auch noch eine Verbindung zur Datenbank. In meiner Klasse passiert dies durch den Aufruf von:


parent::execute($sSelect);


Ich schätze aber mal, dass jeder von euch weiß, wie ihr eure Datenbank ansprechen müsst.


Eine kleine Feinheit hat der Query auch noch; es werden nur User Verbindungen gesucht, wobei eine Verbindung von zwei Usern auch bestätigt wurde. Dies wird in der Datenbank durch das Flag status und status2 bestimmt.


Hier folgt noch die Struktur der Datenbank und dann wünsche ich euch viel Spaß und Erfolg mit dieser Klasse.


CREATE TABLE `buddy_list` (
`ID` varchar(32) collate latin1_general_ci NOT NULL,
`USER_ID` varchar(32) collate latin1_general_ci NOT NULL,
`USER_ID_2` varchar(32) collate latin1_general_ci NOT NULL,
`STATUS` enum('a','r','w') collate latin1_general_ci NOT NULL COMMENT 'a = accepted, r = rejected, w = waiting',
`STATUS_2` enum('a','r','w') collate latin1_general_ci NOT NULL COMMENT 'a = accepted, r = rejected, w = waiting',
`CREATED` datetime NOT NULL,
PRIMARY KEY (`ID`),
KEY `USER_ID` (`USER_ID`),
KEY `USER_ID_2` (`USER_ID_2`)
)


Die Verknüpfung zur User Tabelle erfolgt über USER_ID für den der anfragt und USER_ID_2 für die Person, an die der Request geht.


 


 


Tags für diesen Artikel: ,
Tweet This!Tweet This!

Magische Methoden

Geschrieben von Peter Rother • Montag, 23. Februar 2009 • Kategorie: PHP

Mit PHP 5 wurden auch die magischen Methoden (Interzeptormethoden) eingeführt. Diese Methoden werden dann aufgerufen, wenn eine Aktion auf ein Objekt ausgeführt werden soll und diese Aktion von einer magischen Methode begleitet wird. Es wird dann probiert die entsprechende magische Methode auszuführen, diese muss aber in der Klasse oder der eventuell abgeleiteten Klasse zur Verfügung stehen. Hier findet ihr nun eine Übersicht welche magischen Methoden zur Verfügung stehen und in welchen Fall diese aufgerufen werden. Da diese Methoden schon länger zur Verfügung stehen, werde ich hiermit eine kleine Einleitung schaffen und euch in weiteren Beiträgen zeigen, wie diese Methoden sinnvoll genutzt werden können.

__construct(): wird immer aufgerufen wenn eine neues Objekt einer Klasse instanziert wird.

__destruct(): ist das Gegenteil von __construct() und wird ausgeführt wenn ein Objekt zerstört wird.

__call(): falls eine Methode aufgerufen wird die nicht deklariert ist, wird probiert __call() anzuwenden. __call($sMethodenName, $parameter) nimmt als erstes die aufgerufene Methode und als zweites die Methoden Parameter an.

__get(): greift wenn auf eine nicht vorhandene Objekt Eigenschaft zugegriffen werden soll. Es steht hier der Name der Eigenschaft zur Verfügung.

__set(): auf __set() wird zugegriffen, wenn einer nicht vorhandenen Objekt Eigenschaft ein Wert zugewiesen werden soll. __set() bekommt als Parameter den Namen der Eigenschaft, sowie den zugewiesenen Wert übergeben.

__isset(): wird durch isset() und empty() ausgeführt().

__unset(): wird durch die PHP Funktion unset() aufgerufen.

__sleep(): wird vor einer Serialisierung eines Objektes ausgeführt. Der Aufruf erfolgt somit bei einem Aufruf von serialize($oMeinObjekt).

__wakeup(): das Gegenstück von __sleep() wird durch unserialize() ausgeführt.

__toString(): sollte probiert werden ein Objekt in einen String zu verwandeln, wird diese magische Methode aufgerufen.

__set_state(): wird aufgerufen falls ein Objekt mit var_export() aufgerufen wird.

__clone(): bei dem Versuch ein Objekt mit clone() zu kopieren, wird die magische Funktion __clone() aufgerufen.

__autoload(): wird aufgerufen, wenn ein Objekt einer Klasse erzeugt werden soll, diese Klasse aber nicht deklariert ist. Hierbei ist zu beachten das __autoload() standardmäßig als normale Funktion aufgerufen wird und nicht als Objekt Methode. __autoload kann über Umwege auch als Objekt Methode aufgerufen werden; dazu in einem anderen Beitrag mehr.

Hier habt ihr nun alle magischen Methoden sowie deren Aufrufe. Die Methoden gibt es zwar schon länger, da ich diese Methoden aber nicht mehr missen möchte, wollte ich diese einmal aufführen.

Tags für diesen Artikel: , ,
Tweet This!Tweet This!

20 Tips für schnelleren PHP Code

Geschrieben von Peter Rother • Dienstag, 17. Februar 2009 • Kategorie: Better Code

Heute habe ich für euch ein paar Tips wie ihr euren PHP Code ein wenig schneller und effizienter gestalten könnt. Ich hoffe mal, dass für jeden der ein oder andere Tip dabei ist.

  1. Falls eine Methode als static deklariert werden kann, sollte dies auch getan werden. Dies erhöht die Geschwindigkeit um das 4fache.
  2. echo() ist schneller als print()
  3. Sollten Variablen, Arrays oder Objekte nicht mehr benötigt werden, zerstört sie mit unset().
  4. Meidet magische Funktionen wie __get(), __set() und __autoload().
  5. require_once() ist sehr kostspielig.
  6. Benutzt für include() und require() den vollständigen Pfad.
  7. Benötigt ihr die Zeit an der ein Script gestartet ist, benutzt $_SERVER[’REQUEST_TIME’] anstelle von time().
  8. str_replace() ist schneller als preg_replace().
  9. Es ist besser Switch Statemantes, anstatt große if else Blöcke zu verwenden.
  10. Das Unterdrücken von Fehlern mit @ ist sehr teuer.
  11. Schaltet die Apache mod_deflate Extension ein.
  12. Schließt die Datenbank Verbindungen wenn diese nicht mehr benötigt werden.
  13. Benutzt, falls möglich, keine Funktionen in Schleifen, da diese Funktionen jedes mal ausgeführt werden.
  14. Das Hochzählen einer globalen Variablen ist 2mal langsamer als bei einer Lokalen Variable.
  15. Das Hochzählen einer Objekt Eigenschaft ist 3mal langsamer als bei einer Lokalen Variable.
  16. Das Hochzählen einer nicht initialisierten Variablen ist 9 -10mal langsamer als bei einer initalisierten Variablen.
  17. Probiert so viel wie möglich zu cachen. Benutzt hierfür z.B. den Memcache oder eine OP Code Cache. Bei einem OP Code Cache muss das PHP File nicht jedes mal neu kompiliert werden.
  18. Es muss nicht jede Datenstruktur als Objekt abgebildet werden, ein Array kann hier manchmal genau so helfen.
  19. Benutzt, falls möglich, das Apache Modul mod_gzip. Das Modul komprimiert die Daten um bis zu 80%.
  20. Benutzt eine Profiler wie XDebug für eure Scripte, hier könnt ihr schnell Funktionen finden die zu langsam laufen.
Tags für diesen Artikel: ,
Tweet This!Tweet This!

Start einer Serie zum Thema Doc Blocks

Geschrieben von Peter Rother • Samstag, 24. Januar 2009 • Kategorie: Doc Blocks

Eine Serie zu einem bestimmtem Thema ist doch immer was nettes, so sehe ich das wenigstens. Also habe ich mir vorgenommen hier eine Serie zum Thema Doc Blocks in PHP zu starten.

Als Doc Block Engine habe ich mir phpDocumentor ausgesucht, da ich hiermit schon länger arbeite und ich dieses Tool ohne Einschränkung empfehlen kann. Ein Blick über den Tellerrand kann aber auch nicht schaden, also werden wir uns auch noch ein Paar andere Programme zur Quellcode Dokumentation anschauen. Vielleicht findet sich ja auch jemand der schon mit anderen Systemen wie z.B. Doxygen gearbeitet hat und gerne ein bisschen darüber erzählen möchte. Bei Interesse meldet euch bitte bei mir über das Kontakt - Formular oder über meine E - Mail Adresse aus dem Impressum.

Starten wir werden mit der Installation von phpDocumentor unter PEAR und als Web Interface. Danach gibt es eine kleine Einführung wie ihr den phpDocumentor auf der Kommandozeile ausführen könnt. Natürlich darf auch ein Einblick in die ganzen Doc Block Parameter nicht fehlen, die ich hier im Kommentar schon Angekündigt habe. Darauf wird eine kleine Session zu dem Thema Doc Block Formatierungen folgen, wo vielleicht auch einige von den erfahreneren Leser noch ein Paar neue Sachen kennen lernen können.

Ich glaube dass das ein ganz interessantes Thema werden wird. Ich persönlich freue mich schon darauf.

Tags für diesen Artikel: , , ,
Tweet This!Tweet This!

Verkürzte if Bedingung

Geschrieben von Peter Rother • Donnerstag, 15. Januar 2009 • Kategorie: PHP

Viele werden die folgende Notation schon kennen, manch ein Anfänger aber vielleicht noch nicht. Man kann eine einfache if / else Bedingung noch ein wenig abkürzen und sich so schreibarbeit ersparen. Bei den ersten Anwendungen übersieht man vielleicht diese Schreibweise, aber nach ein paar Einsätzen geht es eigentlich ins Blut über.

Standard Bedingung:

if($variable == true) {

$andereVariable = "stimmt";

} else {

$andereVariable = "stimmt nicht";

}


Verkürzte Anweisung:

$andereVariable = ($variable == true) ? "stimmt" : "stimmt nicht";

Die Bedingung wird hierbei in die Klammern () geschrieben. Das Fragezeichen ? leitet den if Block ein, der Doppelpunkt : den else Block.

Tags für diesen Artikel:
Tweet This!Tweet This!

Deklaration von Variablen

Geschrieben von Peter Rother • Mittwoch, 14. Januar 2009 • Kategorie: Better Code

Leider oder auch zum Glück ist PHP keine stark Typisierte Sprache. Aus diesem Grund sollte man sich aber einen besseren Überblick über die verwendeten Variablen verschaffen, in dem man diese mit einem Kürzel versieht. Dies hat den Vorteil, dass man im Quellcode erkennt um was für eine Typ es sich handeln sollte. Nachfolgend bekommt ihr einen kleinen Überblick darüber wie ich mit der deklaration von Variablen umgehe.


Das erste oder die beiden ersten Zeichen einer Variable nach dem $ bezeichnet den Typ der aktuellen Variablen, danach wird in CamelCase weiter geschrieben.


String:
$sIrgendEinString


Integer:
$iEinSuperInterger


Boolean:
$blKannDasWarSein


Double:
$dEinDoubleMitPunkt


Array:
$aHierHabenWirVieleElemente


Object:
$oHabeIchAmLiebsten

Das sind eigentlich alle Kürzel die mir jetzt einfallen. Diese sollten auch die gängigsten Fälle abdecken. Falls jemand noch eine Idee hat, werde ich diese gerne hier mit aufnehmen.

Tags für diesen Artikel: ,
Tweet This!Tweet This!

Warum PHP Doc Blocks?

Geschrieben von Peter Rother • Sonntag, 11. Januar 2009 • Kategorie: Doc Blocks


Je umfangreicher ein Projekt wird, desto wichtiger wird die Dokumentation. Kommentare helfen, den Programmcode besser zu verstehen. Nach einiger Zeit wissen selbst die Progammierer nicht mehr, was sie vor x Wochen oder Monaten geschrieben haben. Hier kommen die Doc Blocks ins Spiel. Jede Klasse und / oder Methode sollte mit einem Kommentar versehen werden.
Der eigentliche Quellcode sollte durch Aussagekräftige Variablen und Methoden selbst erklärend sein. Ich finde das, wenn man einen Kommentar in einer Methode oder Funktion benötigt, der Code zu umständlich geschrieben ist.

Was genau sollte ein Doc Block erklären? Hier folgt ein kleiner Überblick:

  • welche Aufgabe hat die Funktion / Methode
  • welche Parameter erwartet sie
  • welchen Datentyp gibt sie zurück

Wie genau ist ein Doc Block aufgebaut?

/**
* Hier steht was genau in der Methode passiert
*
* @param int $sId
* @return string
*/

@param gibt an welche Parameter von der Methode benötigt werden.
@return gibt an welcher Typ von der Methode zurück gegeben wird


Der Doc Block wird direkt vor der Klasse oder der Methode angegeben und beginnt mit den Zeichen /**. Jede neue Zeile beginnt mit einem * und das Ende des Doc Blocks wird mit */ eingeleitet.

Eine Auflistung aller Doc Block Tags werde ich demnächst hier vorstellen.
Tags für diesen Artikel: ,
Tweet This!Tweet This!

Example for an php doc block

Geschrieben von Peter Rother • Samstag, 22. November 2008 • Kategorie: Doc Blocks

Here is an little example how you can create your php doc block. This example is copied from the mijane files and it's included to an svn client:

/**
* ### short desc ###
*
* ### long desc ###
*
* PHP 5 // should be php 5 ;-)
*
* @filesource $HeadURL$ // file path from svn
* @copyright Copyright (c) 2008, mijane // your copyright
* @link http://www.mijane.de // your website
* @package mijane_framework // package
* @sub-package core // subpackage
* @since 2008-11-21 // date of creation
* @version 0.0.1 // version like #.#.#
* @revision $Revision:$ // revision
* @author Peter Rother // author
* @modifiedby $Author$ // last committer
* @lastmodified $Date:$ // date
*/



Tags für diesen Artikel: ,
Tweet This!Tweet This!