PHP Dependency Injection issue - php

Ey guys, I am trying to learn Dependency Injection and I wrote this code:
class User {
public $id;
public function __construct($id) {
$this->id = $id;
}
public function getName() {
return 'Alex';
}
}
class Article {
public $author;
public function __construct(User $author) {
$this->author = $author;
}
public function getAuthorName() {
return $this->author->getName();
}
}
$news = new Article(10);
echo $news->getAuthorName();
However, I am getting WSOD. What had I done wrong in it ?

You have specified wrong instance.Use the code below
<?php
class User {
public $id;
public function __construct($id) {
$this->id = $id;
}
public function getName() {
return 'Alex';
}
}
class Article {
public $author;
public function __construct(User $author) {
$this->author = $author;
}
public function getAuthorName() {
return $this->author->getName();
}
}
$news = new Article(new User(10));
echo $news->getAuthorName(); //Outputs Alex
Hope this helps you

Related

How to select from a database using getter and setter methods in PHP

I need to select/insert data from/to database using getter and setter methods. What I'm trying to achieve for now is to select everything from the db and echo it out in html, to see if I'm receiving anything at all.
This the code so far:
class Products extends DbConnect {
protected $id;
protected $sku;
protected $name;
protected $price;
protected $type;
protected $attributes;
public function select() {
$query = "SELECT * FROM products";
$result = $this->connect()->query($query);
$row = $result->fetch(PDO::FETCH_ASSOC);
$this->id = $row['Id'];
$this->sku = $row['SKU'];
$this->name = $row['Name'];
$this->price = $row['Price'];
$this->type = $row['Type'];
$this->attributes = $row['Attributes'];
}
public function getId() {
return $this->id;
}
public function getSKU() {
return $this->sku;
}
public function getName() {
return $this->name;
}
public function getPrice() {
return $this->price;
}
public function getType() {
return $this->type;
}
public function getAttributes() {
return $this->attributes;
}
}
I'm not sure what I have to do next. I tried to see if I get any data like this:
public function __construct($name) {
$this->name = $name;
}
$product = new Products();
echo $product->name;
It tells me I'm not passing any arguments. Do I have to do something else with the selected data before I print it out? I'm completely new to this approach and I'm not really sure what to do.
Your constructor needs to be in the class
class Products extends DbConnect {
protected $id;
protected $sku;
protected $name;
protected $price;
protected $type;
protected $attributes;
public function __construct($name) {
$this->name = $name;
}
public function select() {
$query = "SELECT * FROM products";
$result = $this->connect()->query($query);
$row = $result->fetch(PDO::FETCH_ASSOC);
$this->id = $row['Id'];
$this->sku = $row['SKU'];
$this->name = $row['Name'];
$this->price = $row['Price'];
$this->type = $row['Type'];
$this->attributes = $row['Attributes'];
}
public function getId() {
return $this->id;
}
public function getSKU() {
return $this->sku;
}
public function getName() {
return $this->name;
}
public function getPrice() {
return $this->price;
}
public function getType() {
return $this->type;
}
public function getAttributes() {
return $this->attributes;
}
}
Then you pass the parameters when you define the new class
$product = new Products("Product Name");
echo $product->name;
One thing I would suggest would be to change the constructor to accept an array that way you can pass any number of parameters across and order doesn't matter.
public function __construct(array $config = []) {
$this->name = $config["name"];
$this->id = $config["id"];
}
And then you can send any number of arguments through like this
$options = [
"name" => "ProductName",
"id" => "ProductID"
];
$product = new Products($options);
echo "Name: ".$product->name;
echo "ID: ".$product->id;

PHP Zend Framework serialize array of objects

I have a shopping cart class that I wish to serialize to store in a session variable.
My cart class is
namespace Application\Model\Cart;
use Application\Model\AbstractModel;
use Zend\ServiceManager\ServiceManager;
use Application\Model\Cart\Product;
use Application\Model\Cart\ProductOptions;
use Application\Entity\Products;
class Cart extends AbstractModel
{
protected $products;
protected $totalIncVat;
protected $totalExVat;
public function __construct(ServiceManager $serviceManager = NULL)
{
parent::__construct($serviceManager);
$this->products = array();
$product = new Product();
$product->setProductId(1);
$option = new ProductOptions();
$product->addOption($option);
$this->products[] = $product;
}
public function __sleep()
{
return $this->products;
}
}
As can be seen in the constructor I am adding a test product and product option. The product classes are stored in an array $this->products.
My products class is
namespace Application\Model\Cart;
use Application\Model\Cart\ProductOptions;
class Product
{
protected $productId;
protected $title;
protected $priceEachIncVat;
protected $priceEachVat;
protected $vat;
protected $qty;
protected $total;
protected $options;
public function __construct()
{
$this->options = array();
}
public function getProductId()
{
return $this->productId;
}
public function getTitle()
{
return $this->title;
}
public function getPriceEachIncVat()
{
return $this->priceEachIncVat;
}
public function getPriceEachVat()
{
return $this->priceEachVat;
}
public function getVat()
{
return $this->vat;
}
public function getQty()
{
return $this->qty;
}
public function getTotal()
{
return $this->total;
}
public function getOptions()
{
return $this->options;
}
public function setProductId($productId)
{
$this->productId = $productId;
return $this;
}
public function setTitle($title)
{
$this->title = $title;
return $this;
}
public function setPriceEachIncVat($priceEachIncVat)
{
$this->priceEachIncVat = $priceEachIncVat;
return $this;
}
public function setPriceEachVat($priceEachVat)
{
$this->priceEachVat = $priceEachVat;
return $this;
}
public function setVat($vat)
{
$this->vat = $vat;
return $this;
}
public function setQty($qty)
{
$this->qty = $qty;
return $this;
}
public function setTotal($total)
{
$this->total = $total;
return $this;
}
public function setOptions(Array $options)
{
$this->options = $options;
return $this;
}
public function addOption(ProductOptions $option)
{
$this->options[] = $option;
return $this;
}
}
And finally my product options class is
namespace Application\Model\Cart;
class ProductOptions
{
protected $optionId;
protected $name;
protected $price;
protected $valueId;
protected $value;
public function getOptionId()
{
return $this->optionId;
}
public function getName()
{
return $this->name;
}
public function getPrice()
{
return $this->price;
}
public function getValueId()
{
return $this->valueId;
}
public function getValue()
{
return $this->value;
}
public function setOptionId($optionId)
{
$this->optionId = $optionId;
return $this;
}
public function setName($name)
{
$this->name = $name;
return $this;
}
public function setPrice($price)
{
$this->price = $price;
return $this;
}
public function setValueId($valueId)
{
$this->valueId = $valueId;
return $this;
}
public function setValue($value)
{
$this->value = $value;
return $this;
}
}
The problem I am having is that the classes are not serializing properly.
$serializer = new \Zend\Serializer\Adapter\PhpSerialize();
$serialized = $serializer->serialize($cart);
$cart = $serializer->unserialize($serialized);
When I remove the test product from the cart constructor all works well. The array of products is causing the problem.
The error I am getting is unserialize(): Error at offset 40 of 41 bytes.
The serialized string returned is
O:27:"Application\Model\Cart\Cart":1:{N;}
Does anyone know what I am missing?
Many thanks in advance.
I figured it out. The sleep magic method in cart class should contain return array('products');

Zf2 entity join

Can you help me? I can't understand how to join 2 and more tables, each table has the entity. Whether it is possible to use as in doctrine? I don't want to use doctrine.
How to join entities and use in views?
class User
{
protected $id;
protected $email;
protected $password;
public function getId()
{
return $this->id;
}
public function setId($value)
{
$this->id = $value;
}
public function setEmail($value)
{
$this->email = $value;
}
public function getEmail()
{
return $this->email;
}
public function setPassword($value)
{
$this->password = $value;
}
public function getPassword()
{
return $this->password;
}
}
class Info
{
protected $id;
protected $lastname;
protected $firstname;
public function getId()
{
return $this->id;
}
public function setId($value)
{
$this->id = $value;
}
public function setLastname($value)
{
$this->lastname = $value;
}
public function getLastname()
{
return $this->lastname;
}
public function setFirstname($value)
{
$this->firstname = $value;
}
public function getFirstname()
{
return $this->firstname;
}
}
class User
{
...
protected $info;
...
public function readInfo()
{
return $this->info;
}
public function writeInfo(Info $entity)
{
$this->info = $entity;
return $this;
}
}
class ModelUser
{
public function get()
{
$query = 'query for user with info';
$adapter = Zend\Db\TableGateway\Feature\GlobalAdapterFeature::getStaticAdapter();
$result = $adapter->query($query, \Zend\Db\Adapter\Adapter::QUERY_MODE_EXECUTE);
/* Or use tableGateway */
/* Class methods hydrator */
$hydrator = new \Zend\Stdlib\Hydrator\ClassMethods;
/* Hydrate User entity from result */
$userEntity = $hydrator->hydrate($result->toArray(), new User);
/* Hydrate Info entity from result */
$infoEntity = $hydrator->hydrate($result->toArray(), new Info);
/* Write Info entity to User entity */
$userEntity->writeInfo($infoEntity);
return $userEntity;
}
}
class UserController
{
public function indexAction()
{
$model = new ModelUser();
$userEntity = $model->get();
return array(
'user' => $userEntity
);
}
}

PHP change variables from static function

I have started to build this class, and I want to register a user:
<?php
class User {
protected $_id;
protected $_name;
protected $_email;
protected $_password;
public $isLogged = false;
public $errors = array();
public function __construct() {
}
public static function register($username,$email,$password,$captcha,$agree) {
$user = new self;
array_push($user->errors,'Error!');
}
}
I call it like this:
$user = User::register($_POST['username'],$_POST['email'],$_POST['password'],$captcha,$agree);
if(empty($user->errors)) {
echo 'Success';
} else {
echo 'Failed';
}
Why does it returns Success? I did array_push!
class User {
// ...
public static function register($username,$email,$password,$captcha,$agree) {
$user = new self;
array_push($user->errors,'Error!');
return $user;
}
}
You forgot to return the $user object from register().

How to access variable of one class from other class?

I have situation like this:
// Object Class
class Person_Object {
protected $_id;
public function __construct( $id = null ) {
$this->_id = $id;
}
public function getMapper() {
$mapper = new Person_Mapper();
return $mapper;
}
public function printIdInMapper() {
$this->getMapper()->printIdInMapper();
}
}
// Mapper Class
class Person_Mapper {
public function printIdInMapper() {
// How to access Person_Object's id here and echo id?
}
}
// Code
$personModel = new Person_Object(10);
$personModel->printIdInMapper(); // should print 10
Now how to echo Person_Object's id value 10 in printIdInMapper() function here
Try this:
// Object Class
class Person_Object {
protected $_id;
public function __construct( $id = null ) {
$this->_id = $id;
}
public function getId() {
return $this->_id;
}
public function getMapper() {
$mapper = new Person_Mapper($this);
return $mapper;
}
public function printIdInMapper() {
$this->getMapper()->printIdInMapper();
}
}
// Mapper Class
class Person_Mapper {
$_person
public function __construct( $person ) {
$this->_person = $person
}
public function printIdInMapper() {
echo $this->_person->getId();
}
}
A slightly different approach:
class Person_Object {
protected $_id;
public function __construct( $id = null ) {
$this->_id = $id;
}
public function getId() {
return $this->_id;
}
public function getMapper() {
$mapper = new Person_Mapper();
$mapper->setPerson($this);
return $mapper;
}
public function printIdInMapper() {
$this->getMapper()->printIdInMapper();
}
}
// Mapper Class
class Person_Mapper {
protected $person;
public function setPerson(Person_Object $person) {
$this->person = $person;
}
public function getPerson() {
return $this->person;
}
public function printIdInMapper() {
echo $this->getPerson()->getId();
}
}

Categories