php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Fragen zu Laravel, YII oder anderen PHP-Frameworks.

Antwort
 
LinkBack Themen-Optionen Bewertung: Bewertung: 7 Stimmen, 5,00 durchschnittlich.
  #1 (permalink)  
Alt 30-04-2013, 08:22
Relativity
 Registrierter Benutzer
Links : Onlinestatus : Relativity ist offline
Registriert seit: Apr 2013
Beiträge: 7
Relativity befindet sich auf einem aufstrebenden Ast
Arrow OOP: Subklassen / Subobjekte

Hallo zusammen,

zerbreche mir an einer Programmierung aktuell seit ca. 2 Wochen den Kopf ohne wirklich weiter zu kommen. Auch im Internet finde ich nicht wirklich brauchbare Hilfe, daher vermute ich das mein Lösungsansatz oder meine Suchbegriffe falsch sind. Deswegen wende ich mich an euch:

Ich versuche eine Produktionsauswertung zu machen.

Ich habe eine Basisklasse, welche die nötigen Informationen wie z.B. Datum von, Datum bis etc. enthält.

Diese erzeugt Objekte der Maschinenklasse. In jeder Maschine stehen SOLL + IST Werte der Produktion. Wie viel wurde produziert, wie viel sollte produziert werden, Differenz, Arbeitszeit der Maschine etc.

Die Maschinenklasse erzeugt wiederrum Objekte der Artikelklasse.
Wieder mit SOLL/IST/Zeit.

Die Artikelklasse erzeugt wiederrum Objekte der Produktionsauftragsklasse.
Wieder mit SOLL/IST/Zeit.

Die Produktionsauftragsklasse erzeugt wiederrum Objekte der Prod.Auftr.Detail Klasse, in welcher nur Arbeitsschritte stehen.

Bildlich gesprochen:

[Produktionsauswertung]
|
[Maschine]
|
[Artikel]
|
[Prod.Auftrag]
|
[Prod.Auftrag.Detail]

---------------------------------------------------------------------

Mich erschlägt aktuell die Komplexität der Strings mit welcher ich die unteren Objekte ansprechen muss:

$this->maschine['testmaschine1']->artikel['1000']->prodauf['1215']->proddetail[0]

sowie die Problematik das ich jedes davon noch mit return Funktionen der Variable versehen muss, da die Variablen private sind.

---------------------------------------------------------------------

Gibt es eine "einfachere Möglichkeit" von dem obersten Objekt auf tiefere Subobjekte / die Variablen der Subobjekte zuzugreifen?

Oder ist vllt. mein Lösungsansatz mit der tiefen Verschachtelung komplett falsch?

---------------------------------------------------------------------

Vielen Dank vorab für jede Hilfe.

Relativity.
Mit Zitat antworten
  #2 (permalink)  
Alt 30-04-2013, 09:38
Melewo
 Registrierter Benutzer
Links : Onlinestatus : Melewo ist offline
Registriert seit: Jan 2013
Beiträge: 365
Melewo befindet sich auf einem aufstrebenden Ast
Standard

Du steckst gewiss tiefer in OOP als ich und einige andere haben in Sachen OOP gewiss einiges mehr an Kenntnissen als ich, deshalb nur mal so ein paar allgemeine Gedanken.

Wenn Maschine A zum Beispiel 1000 Stifte pro d und Maschine B 500 Deckel pro d produzieren muss, um sich bezahlt zu machen, dann ist das doch erst einmal gut als Maschinenklasse. Du könntest doch dann eine zweite Klasse für das Auftragsvolumen anlegen. Wenn Du dann die Maschinenklasse nimmst, ein Objekt für Maschine B erzeugst, diesem als Werte für die Eigenschaften die entsprechenden Daten aus der Auftragsklasse zuweist, dann wäre es nach meinen Vorstellungen ausreichen, um auf ein Ergebnis zu kommen, wie:
Code:
Bestellung   Maschine     Zeit     Auslastung
  5.000     500 pro d     10 d        100 %
Das sollte sich sicherlich vereinfachen lassen. Nur würde ich keine Maschinenklasse mit einer Auftragsklasse zusammenwürfeln oder ableiten, da die Maschinenklasse der eigenen Übersicht zur Auswertung der Wirtschaftlichkeit dient, die Auftragsklasse hingegen auch zur buchhalterischen Erfassung. Oder habe ich da jetzt etwas grundsätzlich falsch verstanden?
Mit Zitat antworten
  #3 (permalink)  
Alt 30-04-2013, 10:01
Relativity
 Registrierter Benutzer
Links : Onlinestatus : Relativity ist offline
Registriert seit: Apr 2013
Beiträge: 7
Relativity befindet sich auf einem aufstrebenden Ast
Standard

Hallo Melewo,

dank dir für die schnelle Antwort.

Jedes Objekt hat die gleichen Eigenschaften und die Verkettung der Objekte in die Tiefe muss quasi bestehen bleiben, da ich Artikel 2+3 nur unterhalb von Maschine 2 haben möchte in der Auswertung.

Diese sieht für den User hinterher dargestellt ungefähr so aus:

Produktionsauswertung
|
| Maschine 1: (SOLL: 1000 | IST: 800) (M/P/R: 20/5/5)
| -- Artikel 1: (SOLL: 1000 | IST: 800) (M/P/R: 20/5/5)
|
| Maschine 2: (SOLL: 2000 | IST: 900) (M/P/R: 40/10/10)
| -- Artikel 2: (SOLL: 1000 | IST: 400) (M/P/R: 20/5/5)
| -- Artikel 3: (SOLL: 1000 | IST: 500) (M/P/R: 20/5/5)

Aufklappbar ist hinterher bei Artikel 2 dann die Produktionsaufträge.
Diese können weiterhin aufgeklappt werden ins Detail der Arbeitsschritte.

Deswegen die tiefe Verkettung für den loop der HTML Ausgabe,
damit der Loop quasi innerhalb der Objekte stattfinden kann und
nur die Daten ausgibt, die wirklich unter ihm liegen.
Mit Zitat antworten
  #4 (permalink)  
Alt 30-04-2013, 10:25
Melewo
 Registrierter Benutzer
Links : Onlinestatus : Melewo ist offline
Registriert seit: Jan 2013
Beiträge: 365
Melewo befindet sich auf einem aufstrebenden Ast
Standard

Ja, so etwas verstehe ich schon Dein Anliegen. Vielleicht sollte ich mich auch zurückhalten mit meinen Antworten, bis jemand mit qualifizierteren Tipps aufwartet.

Sollte nur ganz allgemein sein, weil ich das mehr aus einem betriebswirtschaftlichen Blickwinkel betrachtet habe, wo für jede Maschine ein eigenes Konto angelegt werden könnte, bei größeren Unternehmen auch wird, doch auch kleine Unternehmen mindestens eine AfA-Liste erstellen. Und um so eine Auswertung dann vorzunehmen, da stehen weniger Fragen der Programmierung im Vordergrund, weil das dann nur noch Mittel zum Zweck ist, vielmehr ist die Datenbasis wichtig.
Mit Zitat antworten
  #5 (permalink)  
Alt 30-04-2013, 14:10
Guenni61
 Registrierter Benutzer
Links : Onlinestatus : Guenni61 ist offline
Registriert seit: Nov 2011
Ort: Viersen
Beiträge: 128
Guenni61 befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von Relativity Beitrag anzeigen
Hallo zusammen,
. . .
----------------------------------------------------------------------
Mich erschlägt aktuell die Komplexität der Strings mit welcher ich die unteren Objekte ansprechen muss:
$this->maschine['testmaschine1']->artikel['1000']->prodauf['1215']->proddetail[0]
sowie die Problematik das ich jedes davon noch mit return Funktionen der Variable versehen muss, da die Variablen private sind.
---------------------------------------------------------------------
Gibt es eine "einfachere Möglichkeit" von dem obersten Objekt auf tiefere Subobjekte / die Variablen der Subobjekte zuzugreifen?
Oder ist vllt. mein Lösungsansatz mit der tiefen Verschachtelung komplett falsch?
---------------------------------------------------------------------
Vielen Dank vorab für jede Hilfe.
Relativity.
Hi Relativity,
wie du deine Verschachtelung von Klassen umsetzt, müsstest du vielleicht anhand von Beispielen mal darlegen.

Wenn Klassen von anderen Klassen (Basisklassen) abgeleitet werden, deklariert man die Variablen üblicherweise als protected.
Dann erbt die abgeleitete Klasse die Eigenschaften der Basisklasse. Ihre eigenen Eigenschaften werden sozusagen um die Eigenschaften
der Basisklasse erweitert. Somit kann die abgeleitete Klasse auf die Eigenschaften der Basisklasse zugreifen, als wären es ihre eigenen.

Damit entfällt dann auch solch' ein Konstrukt: $this->maschine['testmaschine1']->artikel['1000']->prodauf['1215']->proddetail[0].

Auch kannst du in der Basisklasse Funktionen definieren, die nichts machen und auch keine Parameter erwarten.
Die abgeleitete Klasse erbt diese Funktion und die kann benutzt werden, als wenn es ihre eigene wäre. Heißt, jede abgeleitete Klasse überschreibt
den Funktionsnamen, übergibt eigene Parameter und macht sonst was.

Ein Beispiel mit Fahrzeugklassen aus einem anderen Beitrag:
PHP-Code:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Untitled</title>
</head>
<body>
<?php
abstract class c_fahrzeug{
 protected 
$hersteller;
 protected 
$modell;
 protected 
$typ;
 protected 
$baujahr;
 protected 
$neu;
 public function 
setze_eigenschaft(){
 
 }
 
 public function 
zeige_eigenschaft(){
 
 }
};
class 
c_auto extends c_fahrzeug{
 protected 
$motor;
 protected 
$klima;
 protected 
$navi;
 protected 
$hifi;
  public function 
setze_eigenschaft($hersteller,$modell,$motor,$klima="Nein",$navi="nein",$navi="nein"){
  
$this->hersteller=$hersteller;
  
$this->modell=$modell;
  
$this->motor=$motor;
  
$this->klima=$klima;
  
$this->navi=$navi;
  
$this->navi=$navi;
 }
 public function 
zeige_eigenschaft(){
  echo 
'<p>Hersteller: '.$this->hersteller.'<p>';
  echo 
'<p>Modell: '.$this->modell.'<p>';
  echo 
'<p>Motorbauart: '.$this->motor.'<p>';
  echo 
'<p>Klimaanlage: '.$this->klima.'<p>';
  
// usw. . . .
 
}
};
class 
c_fahrrad extends c_fahrzeug{
 protected 
$rahmen;
 protected 
$schaltung;
 public function 
setze_eigenschaft($hersteller,$modell,$rahmen,$schaltung){
  
$this->hersteller=$hersteller;
  
$this->modell=$modell;
  
$this->rahmen=$rahmen;
  
$this->schaltung=$schaltung;
 }
 public function 
zeige_eigenschaft(){
  echo 
'<p>Hersteller: '.$this->hersteller.'<p>';
  echo 
'<p>Modell: '.$this->modell.'<p>';
  echo 
'<p>Rahmenbauart: '.$this->rahmen.'<p>';
  echo 
'<p>Schaltung: '.$this->schaltung.'<p>';
 }
};
//Ein Auto
echo "<h3>Ein Auto</h3>";
$auto=new c_auto;
$auto->setze_eigenschaft('VW','Golf VII','Diesel');
$auto->zeige_eigenschaft();
//Ein Fahrrad
echo "<h3>Ein Fahrrad</h3>";
$fahrrad=new c_fahrrad;
$fahrrad->setze_eigenschaft('Koga Miyata','Racer 3400 XS','Kohlefaser','Shimano');
$fahrrad->zeige_eigenschaft();
//Ausgabe der Objekteigenschaften
//Hier sieht man, dass die Klassen Fahrrad und Auto die Eigenschaften von der
//Klasse Fahrzeug geerbt haben. Jedoch belegen die Klassen auto und fahrrad die
//Eigenschaften der Klasse Fahrzeug mit ihren eigenen Werten.
echo '<pre>';
var_dump($auto);
echo 
'</pre>';
echo 
'<pre>';
var_dump($fahrrad);
echo 
'</pre>';
?>
</body>
</html>
Hier siehst du, das die Funktionen Eigenschaften der Basisklasse ausgeben, sowie Eigenschaften der abgeleitenden Klasse.

Gruß
Günni

Geändert von Guenni61 (30-04-2013 um 14:23 Uhr)
Mit Zitat antworten
  #6 (permalink)  
Alt 30-04-2013, 14:38
Relativity
 Registrierter Benutzer
Links : Onlinestatus : Relativity ist offline
Registriert seit: Apr 2013
Beiträge: 7
Relativity befindet sich auf einem aufstrebenden Ast
Standard

Hallo Günni,

dank dir für die Antwort. Leider geht es nicht in die Richtung, die ich meinte.

Es geht mir nicht um extenden einer Klasse um diese mit Funktionen
oder Variablen zu erweitern, dies ist bereits alles geschehen und funktioniert.

Es geht mir mehr darum, das bei mir Objekte weitere SubObjekte generieren
und diese widerum weitere SubObjekte. Ich versuche es anhand eines
einfachen Beispiels:

Code:
class auswertung {

    private $maschine;
    private $maschine_name;

    function __construct() {
    
        $this->maschine = array();
        $this->create_maschine();
    }

    function create_maschine() {

        $this->maschine[] = new auswertung_maschine();

    }

}


class auswertung_maschine {

    private $artikel;

    function __construct() {

        $this->artikel = array();
        $this->create_artikel();
    }

    function create_artikel() {

        $this->artikel[] = new auswertung_artikel();

    }

}
Maschine[0] ist ein Objekt der Auswertung
Es gibt noch 8 andere Maschinen.

Artikel[0] ist ein Objekt der Maschine[0].
Diese Zuordnung ist wichtig, für die Auswertung und der späteren
Ausgabeschleife der Artikel, die auf der Maschine produziert werden.

Um nun hinterher an den Inhalt von artikel[0] zu kommen muss ich immer
von dem Objekt der Klasse Auswertung über maschine[0] gehen. Daher die
Frage ob es eine Möglichkeit gibt, die Abhängigkeiten der Artikel zu
der Maschine beizubehalten und direkt mit dem Artikel zu arbeiten ohne:

$prodauswertung->maschine[0]->artikel[0]->irgendeinefunktion();
Mit Zitat antworten
  #7 (permalink)  
Alt 30-04-2013, 15:45
Melewo
 Registrierter Benutzer
Links : Onlinestatus : Melewo ist offline
Registriert seit: Jan 2013
Beiträge: 365
Melewo befindet sich auf einem aufstrebenden Ast
Standard

Mische mich doch noch einmal ein, weil ich den Sinn nicht nachvollziehen kann. Sind aber wieder nur ganz allgemeine Gedanken. Du hast doch die Datensätze von den einzelnen Maschinen in einer DB zu liegen oder nicht?

Name der Maschine, Anschaffungskosten, Datum der Anschaffung, Datum der Abschreibung, Restwert und dann, was ich nicht hatte, Du aber haben möchtest, so wie ich das verstehe, vielleicht noch ein oder zwei Felder, in denen die täglichen Stückzahlen oder Sunden als Soll enthalten sind, um auf 100 Prozent bzw. auf +/- Null zu kommen.

Und diesen Datensatz kannst Du doch einfach für jede Maschine abrufen und mit der tatsächlich produzierten Stückzahl entsprechend dem Auftragsvolumen verrechnen oder nicht? Dazu sollte doch nach meinen Vorstellungen eine Klasse genügen.
Mit Zitat antworten
  #8 (permalink)  
Alt 30-04-2013, 16:47
Relativity
 Registrierter Benutzer
Links : Onlinestatus : Relativity ist offline
Registriert seit: Apr 2013
Beiträge: 7
Relativity befindet sich auf einem aufstrebenden Ast
Standard

Ganz so einfach ist es leider nicht.

Die Datensätze des ERP sehen so aus:

Produktionsauftrag Nummer
Produktions-Artikel
Menge-Soll
Menge-Ist
Arbeiter-Nr
Arbeiter-Zeit
Arbeits-Typ

Auf der Arbeiter-Nummer kann eine Maschinen-Nummer sein, oder ein Arbeiter. Es gibt viele Datensätze zu einem Produktionsauftrag. Jeder Vorgang (Rüsten, Produzieren etc.) ist ein Datensatz. Es kann mehrere Maschinen in einem Produktionsauftrag geben. Die Datensätze die nach einer Arbeiter-Nr kommen, der eine Maschine ist, gehören zu der Maschine.

1;Artikel1;5000;4500;1000;8,5;P
1;Artikel1;5000;4500;1000;1,5;R
1;Artikel1;5000;4500;1010;4,5;P
1;Artikel1;5000;4500;1011;4,5;P
1;Artikel1;5000;4500;1001;8,5;P
1;Artikel1;5000;4500;1010;4,5;P
1;Artikel1;5000;4500;1011;4,0;P

1000 und 1001 wären z.B. Maschinen und 1010 und 1011 wären ein Arbeiter.

Ich habe keine Möglichkeit gefunden es auch nur annähernd irgendwie zu summieren. Daher lasse ich die sql-rows einfach durchlaufen und werte sie manuell aus.

Bitte keine Diskussionen warum das so ist - ich habe es nicht entwickelt - ich kann und darf es auch nicht ändern - es ist nicht mein ERP.

------

Auswerten will ich die SOLL+IST Zahlen, die Maschinen-Stunden,die Rüst-Stunden und Arbeits-Stunden. Die Menge an Arbeitern. Die Abweichungen zu den Vorgabe Werten der Optimal-Auslastung der Maschine.

Zudem soll visualisiert werden welche Artikel auf welcher Maschine produziert werden und wie effektiv.

Zudem soll man durch einen Klick auf den Artikel diesen aufklappen können und die einzelnen Produktionsaufträge sehen.

Diese sollen wiederrum durch einen Klick aufgeklappt werden können für die Details und Arbeitsschritte des Auftrags.


----

Ein Artikel kann auf unterschiedlichen Maschinen laufen.
Ein Produktionsauftrag kann unterschiedliche Maschinen ansprechen.

Es muss somit eine Zuordnung geben zwischen
Maschine<->Artikel<->Produktionsauftrag

Die Maschinen sind unique, die Artikel und Produktionsaufträge nicht.

Ich brauche in den Maschinen, den Artikel und dem Produktionsauftrag die Summen aller Subobjekte damit die Zahlen belegbar sind (Controlling). Beim Aufklappen müssen diese Summen detailliert dargestellt werden.

Loose Objects die man einfach in ner Schleife durchlaufen lässt und
schaut ob sie zur Maschine gehören sind aufgrund der Datenmenge
nicht möglich. Es muss eine direkte und eindeutige Zuordnung geben.

Geändert von Relativity (30-04-2013 um 16:51 Uhr)
Mit Zitat antworten
  #9 (permalink)  
Alt 30-04-2013, 17:19
Melewo
 Registrierter Benutzer
Links : Onlinestatus : Melewo ist offline
Registriert seit: Jan 2013
Beiträge: 365
Melewo befindet sich auf einem aufstrebenden Ast
Standard

Gut, jetzt ist das wenigstens nachvollziehbar, was Du so vorhast.
Mit Zitat antworten
  #10 (permalink)  
Alt 01-05-2013, 06:15
Melewo
 Registrierter Benutzer
Links : Onlinestatus : Melewo ist offline
Registriert seit: Jan 2013
Beiträge: 365
Melewo befindet sich auf einem aufstrebenden Ast
Standard

Nachdem keine weiteren Antworten gekommen sind und ich eine Nacht darüber geschlafen habe, sieht der bisherige Weg für mich nach reichlich Unfug aus. Habe mal zwei Jahre an einer Werkbank gestanden, wir mussten jeden Tag ein Buch führen, was gemacht wurde. Und anders kann das wohl auch nicht sein, nur das heute alles mehr elektronisch erfasst wird. Jeder Bauer weiß, welche Kuh wann den Melkstand aufsuchte, zumindest wenn die Kühe einen Chip tragen oder so und der Melkstand etwas neuer ist. Du versuchst das aber alles abzuleiten und das kann nicht der Weg sein.

Lege für jede Maschine ein Arbeitskonto an, in dem fortlaufend aufgeführt wird, wer an der Maschine stand und wie viele Teile von welcher Art für welchen Auftrag (mit Nummer des Auftrages) fertigte. Und durch diesen Arbeitskonten kannst Du dann einen Query machen, mal nach Auftragsnummer sortieren, mal nach Maschine und mal nach Arbeitnehmer oder mal nach Teilenummer, wie es gerade beliebt.

Da lässt sich dann auch Jahre später noch abrufen, das Max Mustermann am 1. April 2006 in der Zeit von 07.00 bis 08.00 Uhr für den Auftrag mit der Nummer 20201012 genau 312 Schlüsselringe an der Maschine mit der Nummer 07 fertigte. Und es lässt sich auswerten, dass Max Mustermann an der Maschine 07 im angegebenen Zeitraum 4 Schlüsselringe über dem Soll lag und deshalb für eine Prämie vorgeschlagen werden kann.
Und Du kannst nach drei Jahren noch auswerten, das vom Auftrag mit der Nummer 20201012 die ersten 312 an der Maschine 07 von Max Mustermann in der Zeit von 07.00 bis 08.00 Uhr an der Maschine 07 gefertigt wurden und die nächsten 188 Schlüsselringe von Susi Musterfrau in der Zeit 08.01 bis 08.48 Uhr an der Maschine 06. Oder Du kannst auswerten, was immer Du auswerten willst.

Das wäre für mich der einzig gangbare Weg, den ich momentan erkennen kann. Soll heißen, Du hast ja alle Werte und Daten, nur die müssen erneut aufbereitet und abgespeichert werden, in verknüpften Tabellen oder wie auch immer, um diese Daten dann mal nach Maschine, mal nach Auftragsnummer, mal nach Artikelnummer, mal nach Arbeitnehmer abrufen zu können.

Geändert von Melewo (01-05-2013 um 06:39 Uhr)
Mit Zitat antworten
  #11 (permalink)  
Alt 01-05-2013, 15:43
Guenni61
 Registrierter Benutzer
Links : Onlinestatus : Guenni61 ist offline
Registriert seit: Nov 2011
Ort: Viersen
Beiträge: 128
Guenni61 befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von Relativity Beitrag anzeigen
Hallo Günni,
. . .
Maschine[0] ist ein Objekt der Auswertung
Es gibt noch 8 andere Maschinen.
Artikel[0] ist ein Objekt der Maschine[0].
Diese Zuordnung ist wichtig, für die Auswertung und der späteren
Ausgabeschleife der Artikel, die auf der Maschine produziert werden.

Um nun hinterher an den Inhalt von artikel[0] zu kommen muss ich immer
von dem Objekt der Klasse Auswertung über maschine[0] gehen. Daher die
Frage ob es eine Möglichkeit gibt, die Abhängigkeiten der Artikel zu
der Maschine beizubehalten und direkt mit dem Artikel zu arbeiten ohne:
$prodauswertung->maschine[0]->artikel[0]->irgendeinefunktion();
Hi Relativity,
ich hab' das schon verstanden, worauf du hinaus willst. Leg' mal ein Objekt deines Konstrukts an,
und gib das Objekt mit vardump aus.
PHP-Code:
$objekt_auswertung = new auswertung;
echo 
'<br><pre>';
var_dump($objekt_auswertung);
echo 
'</pre>'
Ausgabe:
object(auswertung)#1 (2) {
["maschinerivate"]=>
array(1) {
[0]=>
object(auswertung_maschine)#2 (1) {
["artikelrivate"]=>
array(1) {
[0]=>
object(auswertung_artikel)#3 (1) {
["mengerivate"]=>
NULL
}
}
}
}
["maschine_namerivate"]=>
NULL
}

So ist das nun mal. Wenn man verschachtelt, so kommt man auch nur über den Weg der Verschachtelung an das letzte Element.
Und der Zugriff auf Variablen über eine Funktion bleibt dir wegen private sowieso nicht erspart.

Um noch mal auf mein Beispiel OOP: Subklassen / Subobjekte zurückzukommen.

Auch hier werden die Abhängigkeiten gewährleistet.
PHP-Code:
<?php
class c_artikel{
      protected 
$auftragsnummer;
      protected 
$artikel;
      protected 
$menge;
      public function 
auftrag($auftragsnummer,$artikel,$menge){
             
$this->auftragsnummer=$auftragsnummer;
             
$this->artikel=$artikel;
             
$this->menge=$menge;
      }
};
class 
c_maschine extends c_artikel{
      protected 
$maschinennummer;
      protected 
$kapazitaet;
      public function 
maschine($maschinennummer,$kapazitaet){
             
$this->maschinennummer=$maschinennummer;
             
$this->kapazitaet=$kapazitaet;
      } 
};
class 
c_auswertung extends c_maschine{
      public function 
print_auftrag(){
             echo 
"<h3>Auftragsnummer: ".$this->auftragsnummer."</h3>";
             echo 
"<p>Bestellter Artikel: ".$this->artikel."</p>";
             echo 
"<p>Bestellte Menge: ".$this->menge."</p>";
             echo 
"<p>Wird produziert auf: ".$this->maschinennummer."</p>";
             echo 
"<p>Kapazität/h: ".$this->kapazitaet."</p>";
      }  
};
// Erste Maschinenauswertung
$auswertung[0] = new c_auswertung;
$auswertung[0]->auftrag(12345,'Seidenschal Modell 23A5',500);
$auswertung[0]->maschine('A500',300);
$auswertung[0]->print_auftrag();
// Zweite Maschinenauswertung
$auswertung[1] = new c_auswertung;
$auswertung[1]->auftrag(12395,'Oberhemd Modell 124AB5',1500);
$auswertung[1]->maschine('A800',500);
$auswertung[1]->print_auftrag();
echo 
'<br><pre>';
var_dump($auswertung[0]);
var_dump($auswertung[1]);
echo 
'</pre>';
?>
Der Zugriff auf Variablen ist hier (m.M. nach) einfacher.

Gruß
Günni
Mit Zitat antworten
  #12 (permalink)  
Alt 01-05-2013, 15:47
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.578
h3ll befindet sich auf einem aufstrebenden Ast
Standard

Die Ableitung wird hier falsch verwendet. Eine Ableitung ist immer eine ist-Beziehung.

Auto ist ein Fahrzeug
Banane ist ein Obst

Aber ein eine Auswertung ist keine Maschine.

Davon abgesehen solltest du die komische Benennung "c_klassenname" sein lassen. Klassen werden üblicherweise in Camel-Case (Foo, Bar, FooBar) geschrieben. Nicht klein, nicht komplett groß und mit keinen komischen Kürzeln davor.

Außerdem sollten Funktionsnamen immer ein Zeitwort beinhalten, da ein Funktionsname beschreiben sollte, was eine Funktion tut. Und zu einer Tätigkeit gehört eben ein Zeitwort. zB. erstelleDatensatz(), summiereBeitraege(), zeigeErgebnis(), etc.

Und man sollte nicht mehrere Sprachen mischen. Entscheide dich für Englisch oder Deutsch, aber keine Mischung ala "print_auftrag" oder "create_maschine". Sinnvollerweise ist Englisch die bessere Wahl, da Programme international lesbar sein sollten. Außerdem gibts dann keine Probleme, wenn du fremde Softwarepakete einbindest (sonst hättest du ja wieder eine Sprachvermischung).

Geändert von h3ll (01-05-2013 um 15:51 Uhr)
Mit Zitat antworten
  #13 (permalink)  
Alt 01-05-2013, 18:37
Relativity
 Registrierter Benutzer
Links : Onlinestatus : Relativity ist offline
Registriert seit: Apr 2013
Beiträge: 7
Relativity befindet sich auf einem aufstrebenden Ast
Standard

Hallo zusammen,

vielen Dank vorab für die vielen Antworten.

@Melewo:
Nach wie vor stehe ich vor dem gleichen Problem das die Produktionen in unser ERP System eingegeben werden. Aus diesem ERP System kann ich aufgrund der schlechten Datenbanken keine effektive Auswertung der Maschine und der dazugehörigen Arbeitsgänge vornehmen, da sie nicht zugeordnet werden können. Es gibt keine Zuordnung zu dem Arbeiter und der Maschine, da dies einzelne Datensätze sind und diese nacheinander in der Datenbank stehen mit einer Sortiernummer.

Ich müsste somit erstmal Funktionen schreiben die diese Datensätze auslesen und in einer neuen Form in eine SQL schreiben um sie dann auswerten zu können. Daher versuche ich im ersten Schritt die Daten evtl. direkt auswerten zu können indem ich eine Maschinen-Variable habe, diese überschrieben wird wenn eine Datenbank-Zeile mit einer Maschine kommt, und anschließend alles was kommt immer auf diese Maschine geschrieben wird. Sobald ein neuer Produktionsauftrag kommt wird die Maschinenvariable auf einen Default Wert zurückgesetzt.

@Guenni:
Ein extenden der jeweiligen Klassen macht meiner Meinung nach keinen Sinn, da wie bereits von h3ll gesagt, ein Artikel keine Maschine ist, etc. Die Maschinen- und Artikel-Klassen haben bis auf ein paar Variablen keine Gemeinsamkeiten von den Funktionen her.

Das "Hauptproblem" liegt aber wo anders:
Bei deinem Beispiel (erneut vielen Dank für die Mühe), hast du keinen direkten Bezug der Objekte:

Maschine -> Artikel -> Produktionsauftrag

Wenn ich z.B. zwei Artikel habe, würde ich in deinem Beispiel 2x die Maschinen Klasse extenden, bei beiden Artikeln hätten hinterher die Maschinen-Variablen den Initialwert (0 Stück gefertigt), was aber in dem Moment falsch ist, da beim zweiten Extenden die Maschine ja bereits etwas gefertigt hat und diese Stückzahlen ja mit berücksichtigt werden müssen.

Ich müsste somit hinterher stur alle Objekte durchlaufen und die Stückzahlen addieren lassen, was ich recht umständlich finde, da ich loose objects generiere, welche nicht direkt verknüpft sind und somit das Artikel-Objekt nicht mehr in direkter Abhängigkeit steht zu der Maschine auf der es gefertigt wurde.

In meinem Beispiel kommt diese Abhängigkeit zu stande, indem der Artikel immer ein Objekt das Maschinen Objekts ist, auf dem er gefertigt wurde. Somit kann ich innerhalb des Maschinen Objekts einfach mit einem Loop das Objekt-Array durchlaufen lassen und erhalte alle Artikel.

@h3ll:
Das von mir gestellte Beispiel war nur fix runter geschrieben, habe dabei nicht auf die Funktionsnamen etc. geachtet. Verzeih mein Denglisch
Meine "normalen" Funktionsnamen sind immer englisch.

------------------


Ich danke euch somit für all den input den ich erhalten habe, hatte nur gehofft das es vllt. einen "einfacheren" Weg gibt, durch die Objekte auf tiefer gelegene Objekte zuzugreifen und ich evtl. den jeweiligen Befehl dafür nur noch nicht kannte.

Gruß und euch einen schönen 1. Mai

Relativity
Mit Zitat antworten
  #14 (permalink)  
Alt 03-05-2013, 08:37
litterauspirna
 Registrierter Benutzer
Links : Onlinestatus : litterauspirna ist offline
Registriert seit: Nov 2007
Beiträge: 364
litterauspirna ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Hallo,

du scheinst da einige gravierende Fehler im Softwaredesign zu haben.

Zitat:
[Produktionsauswertung]
|
[Maschine]
|
[Artikel]
|
[Prod.Auftrag]
|
[Prod.Auftrag.Detail]
Eine Produktionsauswertung erzeugt keine Maschine, sondern es wird ein Maschinenobjekt zur Auswertung benutzt.

Eine Maschine erzeugt zwar Artikel, aber nicht in einer Auswertung, in der existieren schon die Artikel, dass bedeutet es muss hinterlegt werden mit welcher Maschine, welche Artikel für welchen Produktionsauftrag gefertigt wurden.

Ein Artikel erzeugt auch niemals einen Produktionsauftrag, denn der Produktionsauftrag muss schon existent sein um einen Artikel zu fertigen, der Auftrag muss sogar schon existent sein bevor du bestimmst welche Maschine für die Produktion von Artikeln eines Auftrages benutzt wird.

Du könntest zum beispiel deine Maschinen in einer Datenbank hinterlegen mit all ihren Eigenschaften etc. und dir eine Klasse programmieren die immer eine Maschine darstellt, aber in der Lage ist verschiedene Maschinen zu erzeugen. Diese Maschinen Klasse könnte eine Factory Methode haben, die Maschinen Objekte erzeugt. Jedes spezielle Maschinen Objekt implementiert ein Interface. Somit ist in der eigentlichen Maschinen Klasse sicher gestellt das alle wichtigen Methoden eines Maschinen Objektes, die immer benötigt werden, vorhanden sind.

Kurzes Beispiel.
PHP-Code:
/**
 * interface für jede spezielle maschine
 *
 */
interface EngineInterface
{
    public function 
__construct();
    
    public function 
setResource($resource);
    
    public function 
setArticelsProMinute();
}

/**
 * klasse maschine, welche objekte spezieller maschinen erzeugt
 *
 */
class Engine
{
    protected 
$_engines;
    
    protected 
$_engineObjects;
    
    public function 
__construct()
    {
        
$this->_engines = new ArrayObject(array());
        
$this->_engineObjects = new ArrayObject(array());
    }
    
    public function 
setEngine($name$class)
    {
        
$this->_engines->offsetSet($name$class);
        return 
$this;
    }
    
    public function 
factory($name)
    {
        if (
$this->_engines->offsetExists($name) !== false) {
            
$this->_engineObjects->offsetSet($name, new $this->_engines->offsetGet($name));
        }
    }
    
    public function 
engine($name)
    {
        if (
$this->_engineObjects->offsetExists($name)) {
            
            if (
$this->_engineObjects->offsetGet($name) instanceof EngineInterface) {
                return 
$this->_engineObjects->offsetGet($name);
            }
        }
    }
}

/**
 * drehmaschinen klasse
 */
class RotatingEngine implements EngineInterface
{
    public function 
__construct()
    {
        
    }
    
    public function 
setResource($resource)
    {
        
    }
    
    public function 
setArticelsProMinute()
    {
        
    }
}

/**
 * fräßmschineen klasse
 *
 */
class MillingEngine implements EngineInterface
{
    public function 
__construct()
    {
    
    }
    
    public function 
setResource($resource)
    {
    
    }
    
    public function 
setArticelsProMinute()
    {
    
    }
}

/**
 * klasse Produktion
 * hier gehört dann noch ein Auftrags und Auftragsdetails objekt rein
 *
 */
class Production
{
    protected 
$_engines;
    
    public function 
__construct()
    {
        
    }
    
    public function 
setEngines(Engine $engine)
    {
        
$this->_engines $engine;
    }
    
    public function 
runProduction()
    {
        
    }
}

/**
 * benutzen der ganzen objekte
 */
$production = new Production();
$engines = new Engine();
$engines->setEngine('rotating''RotatingEngine')
    ->
setEngine('milling''MillingEngine');
$production->setEngines($engines);
$production->runProduction(); 
Dieses Beispiel ist sehr stark vereinfacht, aber so könntest du das vom Grund her aufbauen wenn es z.B. um die Produktion geht. Du kannst natürlich auch dann diese Vorgehensweise für eine Produktionsauswertung nutzen und dort die gleichen Objekte benutzen, bis auf das Production Objekt.

Subklassen gibt so in PHP nicht, dass bietet Java, C++ und C# an, aber leider nicht PHP.

Ich hoffe das hilft dir so ein kleines Stück weiter.

Gruß Litter

[EDIT]
@Guenni61, dein Beispiel von Vererbung (Ableitung) kann man leider falscher nicht darstellen. Eine Maschine ist kein Artikel, sondern eine Maschine produziert einen Artikel, besser sogar sie erzeugt ein Produkt, ein Artikel wird es erst wenn es Angeboten wird zum Kauf und über einen Preis etc. verfügt.

Eine Auswertung ist auch keine Maschine, in einer Auswertung werden höchstens Maschinen die für einen Produktionsauftrag benutzt wurden gelistet mit diversen Detail Auswertungsdaten.

Immer daran denken, eine Vererbung stellt immer (ausnahmslos immer) einen spezialisierten IST Zustand von Klassen (Objekten) dar.

Für den TE wären hier noch Punkte wie Dependensy Injection und Dependensy Injection Container ne gute Sache zum nachlesen.
__________________
Aus dem Dynamo Lande kommen wir. Trinken immer reichlich kühles Bier. Und dann sind wir alle voll, die Stimmung ist so toll. Aus dem Dynamo Lande kommen wir.
http://www.lit-web.de

Geändert von litterauspirna (03-05-2013 um 08:42 Uhr)
Mit Zitat antworten
  #15 (permalink)  
Alt 03-05-2013, 09:08
Relativity
 Registrierter Benutzer
Links : Onlinestatus : Relativity ist offline
Registriert seit: Apr 2013
Beiträge: 7
Relativity befindet sich auf einem aufstrebenden Ast
Standard

Hallo Litter,

dank dir für deine ausführliche Schilderung.

Wie würdest du in einem solchen Design, wo Maschinen und Artikel (die auf ihnen produziert werden) komplett getrennt sind, eine Schleife bauen, die alle Artikel auflistet, die auf der Maschine produziert werden?

Du hast ja quasi keine Abhängigkeit zwischen Maschine und Artikel und müsstest alle Artikel-Objekte einfach stur durchlaufen lassen bis du eins findest wo die entsprechende Maschine drin vorkommt?

PS: in deine Keywords (Dependensy Inj. ..) lese ich mich heute Abend in Ruhe mal ein.

Gruss
Relativity
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[OOP] Smarty und OOP: Object id #1 Rudelwolf PHP Developer Forum 14 08-07-2007 15:40
[OOP] globale variable in PHP5 OOP Creativ PHP Developer Forum 10 20-04-2006 08:52
[OOP] Programm für UML OOP Modellierung ? compuboy1010 Apps und PHP Script Gesuche 2 17-07-2003 14:15
OOP... Sky PHP Developer Forum 9 14-11-2001 14:59
OOP cassikov PHP Developer Forum 1 10-08-2001 12:05

Themen-Optionen
Thema bewerten
Thema bewerten:

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 an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 02:16 Uhr.