Permalänk

[PHP] Använda klasser i klasser

Hej!

Jag har kollat runt på nätet ett bra tag nu och även sökt runt här men inte hittat något som egentligen överensstämmer med mitt problem.

Det är så att jag vill använda klassers metoder i en annan helt orelaterad klass, så arv fungerar inte riktigt heller.

Exempelvis om jag har en databasklass som klarar att utföra diverse operationer i MySQL och vill använda den i en filhanteringsklass:

<?php # Tog bara en metod av min filhanteringsklass så inlägget inte blev så överdrivet långt require("database.class.php"); $database = new database; class file_manager{ function remove($id,$path,$file){ if(!unlink($path.$file){ return false; } else{ $database->query("DELETE FROM tabellen WHERE id='$id'"); # <<---- Detta som bråkar!! return true; } } } ?>

Den gnäller över att jag inte får kalla på en odefinerad metod:
Fatal error: Call to undefined method file_manager::remove() in /var/www/pages/home/page.home.index.php on line 24

# Koden som kallar på metoden $filemanager = new file_manager; $filemanager->remove("1","upload_images/","test.jpg");

Så, till min fråga, är det ens möjligt att göra det jag vill utan att göra en gigantisk klass av allt?

Visa signatur

AMD Ryzen 5800X3D | Corsair Hydro H115i RGB Platinum | 32gb G.Skill DDR4 @ 3600mhz | Asus X570-F | PowerColor RX6900XT RedDevil Ultimate | 1TB m.2 SSD gen 4 | 256gb m.2 SSD gen 4 | 1TB HDD | Phanteks Revolt Pro 1000W | Phanteks Eclipse P500A

Permalänk
Medlem

bästa e kanske att köra en singleton av db klassen o wrappa den i nån db() funktion. Så har iaf jag löst det.

då går ALLTID db()->fetchAll('select....'); att kalla på... varifrån den än kallas

Permalänk
Skrivet av =JoNaZ=:

bästa e kanske att köra en singleton av db klassen o wrappa den i nån db() funktion. Så har iaf jag löst det.

då går ALLTID db()->fetchAll('select....'); att kalla på... varifrån den än kallas

Dum fråga, har sett något om singleton men aldrig riktigt uppfattat vad det egentligen är. Du kanske har någon vettig läsning om det?

Visa signatur

AMD Ryzen 5800X3D | Corsair Hydro H115i RGB Platinum | 32gb G.Skill DDR4 @ 3600mhz | Asus X570-F | PowerColor RX6900XT RedDevil Ultimate | 1TB m.2 SSD gen 4 | 256gb m.2 SSD gen 4 | 1TB HDD | Phanteks Revolt Pro 1000W | Phanteks Eclipse P500A

Permalänk
Medlem

Lägg till en publik variabel i din file_manager klass, låt oss kalla den $db. Istället för $database->query(...) kör du $this->db->query(...)

Sen för användning blir det

$database = new database; $filemanager = new file_manager; $filemanager->db = $database; $filemanager->remove(...);

Kan lösas på andra sätt, men detta är ett.

Permalänk
Medlem

Var ett tag sedan jag knåpade PHP, men måste man inte ange åtkomst till remove-metoden, dvs sätta den till public?

Om man inte gör det i till ex C# så blir det per automatik en privat metod.

public function remove($id,$path,$file) { //kod }

Visa signatur

Sony Vaio FE21M

Permalänk
Medlem
Skrivet av pr0nandy:

Om man inte gör det i till ex C# så blir det per automatik en privat metod.

Skrivet av http://php.net/manual/en/language.oop5.visibility.php:

Methods declared without any explicit visibility keyword are defined as public.

Du kan ju testa köra den som static. Men jag tror att detta kan lösa ditt problem:

... else{ global $database; $database->query("DELETE FROM tabellen WHERE id='$id'"); # <<---- Detta som bråkar!! return true; } ...

Referens: PHP: Variable scope - Manual

Visa signatur

..:: RiJo ::..
Computer: Lenovo X300
Platform: Gentoo

Permalänk
Skrivet av RiJo:

Du kan ju testa köra den som static. Men jag tror att detta kan lösa ditt problem:

... else{ global $database; $database->query("DELETE FROM tabellen WHERE id='$id'"); # <<---- Detta som bråkar!! return true; } ...

Referens: PHP: Variable scope - Manual

Det ser ut att fungera! En stor blöt puss förtjänar du!

Visa signatur

AMD Ryzen 5800X3D | Corsair Hydro H115i RGB Platinum | 32gb G.Skill DDR4 @ 3600mhz | Asus X570-F | PowerColor RX6900XT RedDevil Ultimate | 1TB m.2 SSD gen 4 | 256gb m.2 SSD gen 4 | 1TB HDD | Phanteks Revolt Pro 1000W | Phanteks Eclipse P500A

Permalänk
Medlem
Skrivet av Fjanterifjant:

Det ser ut att fungera! En stor blöt puss förtjänar du!

Den lösningen var den fulaste du kan använda. Gör då hellre som No0Vad beskrev.

Permalänk
Medlem

Det egentliga problemet är att du försöker blanda två programmeringstekniker på fel sätt. Om du istället har $database som en variabel i din filemanager-klass kommer dess funktioner få tillgång till den. På samma gång garanterar du att det verkligen finns en databas att tillgå, vilket du inte kan göra om du hämtar in en global variabel i klass-scope. Då kan du ju faktiskt lika gärna skrota file_manager rakt av och bara köra funktionellt...

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem
Skrivet av Teknocide:

Det egentliga problemet är att du försöker blanda två programmeringstekniker på fel sätt.

Sant. Eventuellt kan man wrappa upp databas-klassen i en annan klass som implementerar alla SQL-queries i olika funktioner. Detta genererar mer kod, fast da far man alla SQL-queries pa ett stalle. Exempel (OBS: pseudo-kod):

class db { private $link = db_stuff; public function query($sql) { // execute SQL qeury and return result } } class wrapper { private $db = new db(); public function removeFile($id) { $result = $db->query("DELETE FROM tabellen WHERE id='$id'"); return ($result == 1); } } class file_manager { // har kan du anvada db istallet for wrapper som namnts tidigare! private $dbw = new wrapper(); public function remove($id, $path, $file){ if(!unlink($path.$file)) return false; else return $dbw->removeFile($id); } }

PHP-kod har en formaga att bli en hybrid mellan olika programmerings paradigmer. Vilket kan vara bra, men det kan ocksa stalla till massa problem.

Visa signatur

..:: RiJo ::..
Computer: Lenovo X300
Platform: Gentoo

Permalänk
Medlem

Detta skapar ett gyllene tillfälle att kolla igenom grunderna för klasser och object i PHP:
PHP: Classes and Objects - Manual

Jag plöjde igenom den när jag började ge mig in på detta område.

Som alltid så finns det mycket matnyttigt på:
PHP: Hypertext Preprocessor

Ett måste för PHP utvecklaren.

Sedan skulle jag i ditt fall kolla under "extends" på denna länk:
PHP: The Basics - Manual

extends

Saxat från ovan länk:

A class can inherit the methods and properties of another class by using the keyword extends in the class declaration. It is not possible to extend multiple classes; a class can only inherit from one base class. The inherited methods and properties can be overridden by redeclaring them with the same name defined in the parent class. However, if the parent class has defined a method as final, that method may not be overridden. It is possible to access the overridden methods or static properties by referencing them with parent::. When overriding methods, the parameter signature should remain the same or PHP will generate an E_STRICT level error. This does not apply to the constructor, which allows overriding with different parameters.

Simple class inheritence

<?php class ExtendClass extends SimpleClass { // Redefine the parent method function displayVar() { echo "Extending class\n"; parent::displayVar(); } } $extended = new ExtendClass(); $extended->displayVar(); ?>

Lycka till.

Visa signatur

Fractal Design Arc Svart | MSI Z68A-GD55 G3 REV B3 | Intel® Core i7 2600K, 3.4GHz, 8MB | Corsair 16GB (4x4096MB) CL9 1600Mhz VENGEANCE LP | MSI GeForce GTX 670 | Phanteks PH-TC14PE CPU Cooler (vit) | Corsair Power Supply 650W TX M, Modular, ATX, PS/2 | SSD (okänd tillverkare) + 2 äldre SATA2 diskar på 750 Gb, 350 gb. | OS: Microsoft Windows 10 home.

Permalänk
Medlem
Skrivet av BlueEyes:

Sedan skulle jag i ditt fall kolla under "extends" på denna länk:
PHP: The Basics - Manual

Att skapa en underklass är dock fel i detta fall. En filhanteringsklass är ingen "specialiserad databas", och det finns ingen anledning att ärva hela databasklassen. En singleton eller en medlemsvariabel är bättre i detta fall, åtminstone ur OOP-synpunkt.