PHP - Abstract Classes And Interfaces
Would someone help me out with Abstract Classes and Interfaces...
Some questions... 1.) When you have an Interface with Methods, then any Concrete Class that "implements" said Interface must include all of the listed Methods, correct? 2.) When you have an Abstract Class with Properties & Methods, are you required to use all of the listed Properties & Methods similar to how an Interface works? 3.) What is the intent of using Abstract Classes vs. Interfaces? TomTees Similar TutorialsI am seriously trying to wrap my head around abstract classes, but the more I try to understand it the more I get confused.
I've even dug out a book by Larry Ullman to no avail.
Here's the example in the book:
Shape abstract class
<?php # Script 6.1 - Shape.php /* This page defines the Shape abstract class. * The class contains no attributes. * The class contains to abstract methods. * - getArea() * - getPerimeter() */ abstract class Shape { // No Attributes to declare. // No constructor or destructor defined here. // Method to calculate and return the area. abstract protected function getArea(); // Method to calculate and return the perimeter. abstract protected function getPerimeter(); } // End of Shape Class.Triangle class: <?php # Script 6.2 - Triangle.php /* This page defines the Triangle class. * The class contains two attributes: * - private $_sides (array) * - private $_perimeter (number) * The class contains three methods. * - __construct() * - getArea() * - getPerimeter() */ class Triangle extends Shape { // Declare the attributes: private $_sides = array(); private $_perimeter = NULL; // Constructor: function __construct($s0 = 0, $s1 = 0, $s2 = 0) { // Store the values in the array: $this->_sides[] = $s0; $this->_sides[] = $s1; $this->_sides[] = $s2; // Calculate the perimeter: $this->_perimeter = array_sum($this->_sides); } // End of constructor. // Method to calculate and return the area: public function getArea() { // Calculate and return the area: return (SQRT( ($this->_perimeter/2) * (($this->_perimeter/2) - $this->_sides[0]) * (($this->_perimeter/2) - $this->_sides[1]) * (($this->_perimeter/2) - $this->_sides[2]) )); } // End of getArea() method. // Method to return the perimeter: public function getPerimeter() { return $this->_perimeter; } // End of getPerimeter() method. } // End of Triangle Class.and to execute in finding the area and perimeter of a triangle: <!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <title>Abstract Class</title> </head> <body> <?php # Script 6.3 - abstract.php // This page uses the Triangle class - (Script 6.2), which is derived from Shape (Script 6.1) // load the class definitions: require('Shape.php'); require('Triangle.php'); // Set the triangle's sides: $side1 = 5; $side2 = 10; $side3 = 13; // Print a little introduction: echo "<h2>With sides of $side1, $side2, and $side3...</h2>\n"; // Create a new triangle: $t = new Triangle($side1, $side2, $side3); // Print the area. echo '<p>The area of the triangle is ' . $t->getArea() . '</p>'; // Print the perimeter. echo '<p>The perimeter of the triangle is ' . $t->getPerimeter() . '</p>'; // Delete the object: unset($t); ?> </body> </html>What is the point of having an abstract class when it runs fine without it being declared? For example I can take out extends Shape in the Triangle class and it will work just fine? I don't know if If I will ever understand this concept of abstract and interface classes.... Any help in this matter will be greatly appreciated. Thanks John OK, I fooled around with it some more and took out the include('Shape.php') and it spat an out an error stating it wasn't found. So is an abstract class just forcing a person to adhere to the methods being declared in the abstract class? (I'm probably not explaining this right). Edited by Strider64, 03 October 2014 - 10:55 AM. Hi, I am trying to get my head around classes, interfaces and methods for different animals
this is what I have so far: <?php interface animal { function walk(); function fly(); function swim(); } class monkey implements animal{ const interface1 = "I am from test class"; function noise() { echo "ooh ooh ah ah!"; } function walk() { echo "monkey is walking"; } function fly() { echo "monkey is Flying"; } function swim() { echo "monkey is Swimming"; } public function display() { echo monkey::interface1; echo PHP_EOL; } } class bear implements animal{ const interface1 = "I am from test class"; function noise() { echo "Grrr!"; } function walk() { echo "Bear is walking"; } function fly() { echo "Bear is Flying"; } function swim() { echo "Bear is Swimming"; } public function display() { echo bear::interface1; echo PHP_EOL; } } $Obj = new monkey(); $Obj->display(); $Obj1 = new bear(); $Obj1->display(); ?> I'm a bit stumped as animal interface not calling all functions?! please help I was given the snippet below and am trying to figure some things out... abstract class FormCollection{ protected $fields = $_POST; protected $validator; protected function __construct($validator){ $this->validator = $validator; } // and so on... } class RegistrationForm extends FormCollection{ private $formInputs = array(); // and so on... } Questions: ----------------- 1.) If I instantiate the concrete class, RegistrationForm, like this... $form = new RegistrationForm(new Validator()); What does that do to the abstract class, FormCollection? Is it getting instantiated too? 2.) I thought you could NOT instantiate an abstract class like FormCollection? 3.) If you can't, then why is there a constructor in the abstract class like FormCollection? 4.) This code seems wrong... protected $fields = $_POST; I was told by somene that PHP doesn't allow you to assign values to a class method at compile time unless the values come from a constant?! TomTees I've been spending long hours learning about classes and their magic methods. I just came across a tutorial which showed a constructor like this:
class Device { //... public function __construct(Battery $battery, $name) { // $battery can only be a valid Battery object $this->battery = $battery; $this->name = $name; // connect to the network $this->connect(); } //... }the Battery part instantly caught my attention. Here had previously made a Battery class (and a more complete Device class) but the next thing he did really caught my interest: $device = new Device(new Battery(), 'iMagic'); // iMagic connected echo $device->name; // iMagicwhat the hell is going on here? Is this another way to include the methods and properties of one class into another class, in order words is this the same thing as: class Device extends BatteryI don't think so because this new Battery() thing looks more like its creating an object inside the Device object. Previously the only way I could to that was to type $battery = new Battery() inside one of my methods. But this looks like hes doing something different. Can anyone explain whats going on here? The whole tutorial is he http://code.tutsplus...-php--net-13085 in the main Device method he has a premade $battery variable to hold the Battery object. Sometimes I have multiple classes containing functions which I'd like to include in my main class. I can only extend one class, so I usually extent a class containing only properties, no methods. I still don't know what difference making that info class abstract is, I'd appreciate if anyone could tell me. Also I'd love to know what the point in static methods is. I've never used them because I've never seen the point. Is it just to make it easier to call the methods because you don't need to create an object instance to call them? Sorry for the extra questions, the first one is what I'm really wondering about. So I have been writing PHP constantly for a few months now, and have a pretty good grasp on OOP coming from other languages. One thing I never really use is interfaces, I get it when a class implements an interface, that class is required to have implemented methods from a interface, or a constant that is required by an interface. Seems like the kinda thing you would need when you are on a large team mainly for naming consistency? Is this something I should be using? I know I can get away with not using it, but should I use it to be up to modern php standards?
Thanks
Can someone help me understand this code... Quote abstract class FormCollection{ protected $fields = $_POST; protected $validator; protected function __construct($validator){ $this->validator = $validator; } } Questions: ---------------- 1.) If an Abstract Class cannot be instantiated, then how can there be Properties? 2.) I guess $fields is supposed to be an array? How do I know that? Isn't there a way to do "type hinting" or whatever? 3.) What data-type is $validator? TomTees I can't find an explicit answer on this anywhere, but when you create a child class from an abstract class must you use ALL of the methods that are inside the abstract class in the new child class? Or are these methods just available to the child class to pick and choose?
What is the purpose of using an Interface in OOP? I understand the textbook definition, but am not getting the extra value that they provide... TomTees I am working on a module that receives some info and provides dimensions and weights of products to the caller.
The way I get those is from existing Excel tables used by the company. Some product types have their dimensions only. Some have both dimensions and weights. To clarify - all products have both weight and dimensions but not all are specified on the Excel tables that I am using. so say "Apple" has dimensions on 1 x 1 x 1, but no weight is given. (Weight can be computed separately and in fact there is an existing class that does this already for Pear.). and "Pear" has dimensions 2 x 1 x 1 and weighs 1lbs. In short, some classes have both getWeight() and getDimensions() methods, like Pear(), and some classes just have getDimensions(), like Apple(). I am confused as to which way to go. I can create PearDimensions() class and PearWeight() and separate concepts of "weight" and "dimensions" some more and use a DimensionFactory() and WeightFactory() to instantiate the right object for the circumstances, or I can use "implements" WeightAwaretInterface and HeightAwaretInterface on Apple/Pear classes and leave them as is, thus mixing up the Weight/Dimension getters/causes. So in short I am a tad confused and wondering if there is just a good way to maintain these. Right now I am using DimensionFactory() and WeightFactory() and instantiate Pear class twice (once in each factory) since Pear has both getWeight() and getDimensions() methods. I feel weird creating the same Pear object in both factories. Do you have a recommendation for this, or do I just "hack it" (i.e. leave it as is)? I've been searching high and low for some decent (actually, they can be crap, just be REAL) real-world examples of uses of abstract classes and interfaces. I've seen many design patterns, and I get the concept, but now I need to put them into practice. And I gotta say, I'm absolutely sick of class Animal, class Dog extends Animal, class Vehicle, class Van extends Vehicle examples. Those are CRAP for illustrating real uses of the functionality given to us by OOP. It's one thing to teach a concept, and it's another to put into use within a real application. I can only find the former and the not the latter. Does anyone have any links to, or can they post their own examples of, abstract classes and interfaces in use? Do interfaces in PHP include default methods, which are available in Java 7 and 8. Default methods allow you to add default functionality in the interface itself. So when a class implements it, it can use the default definition from the interface. This is in contrast to an abstract method which has no method body.
Not sure how to describe what I'm trying to do here in the title, but here goes with what I am trying to accomplish. I've got a few hundred lines of code in total so far, so I'll try to keep it as short as I can. I've got an application that I am programming using classes for each module and right now I am coding the base classes that I need in order for it to run (database, errors, logging, etc). What I'm doing for my database class is I have a query factory and it extends the MySQLi class so I can process, clean and code the rest of my app faster. I also have another, unrelated class "Error", which will be used for processing errors I might come across. I'd rather do it this way instead of having to call trigger_error and error_log every time there is an error. I'd also not like to have to call a new instance of an object every time I need to use something from that class. Is there any way I can call a class within a class and return it as an object for all the methods within the class? I've tried the methods below, but no luck I've tried others, but I'm trying to keep it brief and get what I'm trying to do across. <?php class QueryFactory extends MySQLi { public $err = new error(); //Doesn't work. public $err = error(); //Nope. #This is the function that I need the $err object for. function set($fields, $newvals) { if ( is_array($fields) && is_array($newvals) ) { if ( count($fields) != count($newvals) ) { //Instead of below, I want to do something like $err->('Array lengths must match for method', 256, $islogged = 1); trigger_error('Array lengths must match for method', 256); } } } } The thing is, I have a "run.inc.php" which does include and create new objects for running just the basic app and if I try to redeclare the error class in query.class.php, it gives me an error saying I can't do that, but if i try to call $err from the page that has all the classes defined it throws an error saying that my method is undeclared. I'd like my error class be available to every other class I create so I can display and log errors as needed. Any suggestions or links to point me where I'd like to go? Hi. I want to know how I access calsses in PHP. I mean how I search for class that I want and need. do I need to search in php.net? and what editors that provide access the the whole php classes and who they keep updated? Cheers. im currently doing a large php project and i am confident i can do it. Its a basic forum like phpbb or mybb where users can download the files and instal. however i have looked through their code and i see they use classes. I have never learned to do classes since i havent had to use them yet. should i be using them now for this project? do i need to? and if so then what are the benefits? Hello All, I am fairly new to PHP class development, and I was wondering if it is normal behaviour to see classes not being able to access global variables related to PHP-based requests ($_GET, $_SESSION, etc.)? I seem to either have to use "global <var>" inside of the class to access the data, or I am forced to change the methods so then such required data is passed in as parameters. Perhaps I am just doing something wrong? Here is an example of what I mean: class Something { function aFunc() { if (isset($_SESSION['somedata'])) { return false; } // this always returns false whether I had set the value or not } function bFunc() { global $_SESSION; // figured this would already be in a global accessible scope if (isset($_SESSION['somedata'])) { return false; } // now this will return false only when the value is set } } Now the above example is commented to demonstrate what I was meaning above, and I was wondering if this was the 'norm' when developing classes for PHP (and thus such values should be passed as parameters)? Thanks! I have just start using PHP classes and was wondering how you continue an instance of a class in another file. For example I have a folder called "includes" where I includes files that I send data to when I perform ajax request. However how do I continue an instance of class in these files? Hope that makes sense. Thanks for any help. How can i get my class to be showed on the front page here is the front page <?php require('ex2.php'); $start = new A(); $tart->Display(); ?> now here is ex2.php <?php ini_set('display_errors', 1); error_reporting(E_ALL); class A { public $title = "test1"; public $end = "test2"; } function __set($name, $value) { $this->$name = $value; } function Display() { echo $title; echo $end; } ?> shoudn't this print test1 and test2 ? Hi there,
This might a newbie question but I need help understanding PHP classes which am currently learning.
I have an index page.
With this three included files.
database.php
config.php
account.php
on database.php, the class is declared using $connection new Database(...), on this page is also all the coding for this class.
In config.php is a declared class of $account new Account($user_id);
and on account.php is all the details for the account class.
on the index.php is echo $account->sayHello;
However, My page is throwing out an error because I'm trying to use $connection->query(..) in my account.php / Account class.
I have tried to extend the Account class with Database but still have no luck.
How can I make sure the I can use a class function from another page in my Account class?
Thanks for reading
Take the following example: <?php class a { var $things; public function __construct($stuff) { $this->things = $stuff; } } class b { var $morethings; $this->morethings = "something"; } $c = new a(new b); echo $c->things->__PARENT__; ?> The line "echo $c->things->__PARENT__;" (as you can probably imagine) does not work. How would I output what the 'b' object is stored in ('a')? |