Best pratice : how to make a good class in php [closed] - php

Closed. This question is opinion-based. It is not currently accepting answers.
Want to improve this question? Update the question so it can be answered with facts and citations by editing this post.
Closed 6 years ago.
Improve this question
I would like to improve my php web development, so, i would like to know what is your best pratice when you make a new object class ?
I have a sample of a class object. I would like to know how do you do this. If it's good or bad.
Class Contact extends Object {
public $id;
public $firstname = 'john';
public $lastname = 'doe';
public function __construct($id_contact = NULL) {
parent::__construct($id_contact);
if ($this->id) {
$this->fullname = $this->firstname . ' '.$this->lastname
}
}
public static function getFullName($id_contact){
$cnt = new Contact($id_contact);
return $cnt->fullname;
}
}
And use the method like this in different controller :
$cnt_fullname = Contact::getFullName($id);
Or it's better to load new object in the controller
$cnt = new Contact($id);
$cnt_fullname = $cnt->fullname;
Thanks you for your reply.

The way I make good classes:
class Good
{
}

So, for example best way
class Getter {
private static $contact = null
public static function getContactObj($id) {
if(!is_null(self::$contact)) {
return self::$contact;
}
self::$contact = new Contact($id);
return self::$contact;
}
}
and your class contact
Class Contact extends Object {
public $id;
public $firstname = 'john';
public $lastname = 'doe';
public function setId($id) {
$this->id = $id;
return $this;
}
public function getFullName()
$this->fullname = $this->firstname . ' '.$this->lastname
return $this->fullname;
}
}
And you can use this construction in over controllers:
Getter::getContactObj()
->setId(1)
->getFullName();
Getter::getContactObj()
->setId(2)
->getFullName();
Getter::getContactObj()
->setId(3)
->getFullName();
and etc.

Related

Return Object Instead of Array [closed]

Closed. This question needs details or clarity. It is not currently accepting answers.
Want to improve this question? Add details and clarify the problem by editing this post.
Closed 6 months ago.
Improve this question
I really searched too much but i couldn't find anything. I'm newbie to classes that's why I'm getting trouble :)
My class is like below:
class Instagram
{
public array $account = [];
public function get_instagram_business_accounts(): array
{
return db()->query("SELECT followers_count FROM instagram_business_accounts ORDER BY username")->fetchAll();
}
public function get_followers_count()
{
return Miscellaneous::number_format($this->account["followers_count"]);
}
}
I'm using the above class like this:
$accounts = new Instagram();
foreach($accounts->get_instagram_business_accounts() AS $account){
$accounts->account = $account;
echo $accounts->get_followers_count();
}
But I want to use like this:
$accounts = new Instagram();
foreach($accounts->get_instagram_business_accounts() AS $account){
echo $account->get_followers_count();
}
I want to use $account as an object. How can I do this?
Best Regards,
=======
EDIT
I updated my main class like below:
class Instagram
{
public function get_instagram_business_accounts(): array
{
$accounts = db()->query("SELECT followers_count FROM instagram_business_accounts ORDER BY username")->fetchAll();
$return = [];
foreach($accounts AS $account){
$return[] = new InstagramAccount($account);
}
return $return;
}
}
And my InstagramAccount class is below:
class InstagramAccount
{
private int $followers_count;
public function __construct(array $Instagram)
{
foreach($Instagram AS $key=>$value){
$this->{$key} = $value;
}
}
public function get_followers_count(): string
{
return Miscellaneous::number_format($this->followers_count);
}
}
Now I do what i want, right?
get_followers_count() is a method of class Instagram. In your second code you try to call this method from $account which is an array. That doesn't work

how to handle the states of an object [closed]

Closed. This question is opinion-based. It is not currently accepting answers.
Want to improve this question? Update the question so it can be answered with facts and citations by editing this post.
Closed 4 years ago.
Improve this question
What would be the correct way to handle the types of state that an object can have in an application?
For example, if i have an AcceptanceCriteria class, i need to verify if it is accepted, rejected or pending.
I usually do it by returning numbers that represent the state, but it does not seem like a good form, it can be confusing.
for example:
class AcceptanceCriteria
{
const PENDING = 0;
const ACCEPTED = 1;
const REJECTED = 2;
protected $state = self::PENDING;
public function accept():void
{
$this->state = self::ACCEPTED;
}
public function reject():void
{
$this->state = self::REJECTED;
}
public function state():int
{
return $this->state;
}
}
I need to check the state frequently and also show it in the front, what is a better way to do it? I dont want to check in the front if and acceptance criteria state is 0, 1 or 2 for do something.
How about some accessors that return booleans rather than ints so your algorithm is completely encapsulated?
class AcceptanceCriteria
{
const PENDING = 0;
const ACCEPTED = 1;
const REJECTED = 2;
protected $state = self::PENDING;
public function accept():void
{
$this->state = self::ACCEPTED;
}
public function reject():void
{
$this->state = self::REJECTED;
}
// Accessors
public function is_rejected():bool
{
return self::PENDING == $this->state;
}
public function is_accepted():bool
{
return self::ACCEPTED == $this->state;
}
public function is_rejected():bool
{
return self::REJECTED == $this->state;
}
}
Its good way to use strongly typed enums. You can use splEnum or smart implementation from My C-Labs.
First move your states to separated enum class
<?php
use MyCLabs\Enum\Enum;
class AcceptanceCriteriaStateEnum extends Enum
{
private const PENDING = 0;
private const ACCEPTED = 1;
private const REJECTED = 2;
}
then you can modify your class like bellow
class AcceptanceCriteria
{
protected $state = AcceptanceCriteriaStateEnum::PENDING;
public function setState(AcceptanceCriteriaStateEnum $state):void
{
$this->state = $state;
}
public function getState():int
{
return $this->state;
}
public function isInState(AcceptanceCriteriaStateEnum $checkState):bool
{
return $this->state == $checkState;
}
}
for checking state you can use method isInState which return boolean
$obj = new AcceptanceCriteria();
$obj->setState(AcceptanceCriteriaStateEnum::ACCEPTED);
// check status
echo $obj->isInState(AcceptanceCriteriaStateEnum::ACCEPTED);

echo OOP php method [closed]

Closed. This question needs details or clarity. It is not currently accepting answers.
Want to improve this question? Add details and clarify the problem by editing this post.
Closed 6 years ago.
Improve this question
I had one lesson in OOP which included messaging between classes. On the tutorial, the guy just showed var_dump output version of that. I wanted to play with the code and change from var_dump to echo output, because it would me more useful in future. I just couldn't find any solution so you guys are my only option. Here's the code.
<?php
class Person {
protected $name;
public function __construct($name)
{
$this->name = $name;
}
public function getName()
{
return $this->name;
}
}
class Business {
// adding Staff class to Business
public function __construct(Staff $staff)
{
$this->staff = $staff;
}
// manual hire(adding Person to Staff)
public function hire(Person $person)
{
// add to staff
$this->staff->add($person);
}
// fetch members
public function getStaffMembers()
{
return $this->staff->members();
}
}
class Staff {
// adding people from Person class to "member" variable
protected $members = [];
public function __construct($members = [])
{
$this->members = $members;
}
// adding person to members
public function add(Person $person)
{
$this->members[] = $person;
}
public function members()
{
return $this->members;
}
}
// you can also create an array with this method
$bros = [
'Bro',
'Zdenko',
'Miljan',
'Kesten'
];
// pretty simple to understand this part
$employees = new Person([$bros]);
$staff = new Staff([$employees]);
$business = new Business($staff);
var_dump($business->getStaffMembers());
// or the print_r, it doesn't matter
print_r($business->getStaffMembers());
?>
Try to loop through the array and echo out every single value.
$array = $something //your assignment here
foreach($array as $key => $value ){
echo "$key => $value\n";
}

Where should I check that the values are right, in the constructor or before passing the values as arguments? [closed]

Closed. This question is opinion-based. It is not currently accepting answers.
Want to improve this question? Update the question so it can be answered with facts and citations by editing this post.
Closed 6 years ago.
Improve this question
Let's say that i'm writing a class that will make basic CRUD operations, so I want that all the values that are going to be inserted to the database are all in lowercase.
so, I make sure that the values are all in lower case in the constructor, like this for example:
class Insert {
private $name;
private $lastname;
public function __construct($name, $lastname) {
$this->name = strtolower($name);
$this->name = strtolower($lastname);
}
}
$obj = new Insert('Jhon', 'Doe');
Or before creating the instance, like this:
class Insert {
private $name;
private $lastname;
public function __construct($name, $lastname) {
$this->name = $name;
$this->name = $lastname;
}
}
$obj = new Insert(strtolower('Jhon'), strtolower('Doe'));
I would set a DTO to format the values. Is more readable and your class doesn`t need to know if is strlower or not, only set the variables.
Class DTO:
class UserDto
{
public $lastname;
public $name;
function __construct($name, $lastname)
{
$this->lastname = strtolower($lastname);
$this->name = strtolower($name);
}
}
Then you can do
$userDto = new UserDto('Jhon', 'Doe');
$obj = new Insert($userDto);
$obj->save();
And
class Insert
{
private $name;
private $lastname;
public function __construct($userDto)
{
$this->name = $userDto->name;
$this->lastname = $userDto->lastname;
}
}
Now if sometime you need that the name and the lastname doesn´t need to be strolower anymore, the only thing that you need to do is change the class DTO without affect Insert class.

OOP - How to define what object create? [closed]

Closed. This question needs details or clarity. It is not currently accepting answers.
Want to improve this question? Add details and clarify the problem by editing this post.
Closed 8 years ago.
Improve this question
I ask your advise.
In my php file there are some classes.
class Template {
public $id;
public $title;
public $text;
public $description;
public $data = array();
public $content_html;
public $width_content = 500;
public $type;
public $time;
public $user;
public $category;
protected $CI;
// The next code works for a one element of array $data
function __construct($data = array()){
$this->title = $data['title'];
$this->text = $data['text'];
$this->category = $data['category'];
$this->type = $data['type'];
$this->time = $data['time'];
$this->CI =& get_instance();
$this->user = new InformationUser($data);
}
class Articles extends Template {
}
class News extends Template {
}
class Init {
public $posts = array('type' => 2);
}
The start point of my classes is a class Init.
Inside this class there is array of users posts.
In each element array there is a type value, which define what object class I must create.
For example:
class Init {
function define(){
foreach($this->posts as $val){
if($val['type'] == 2){
$article = new Articles($val);
//TODO $articles
} else if($val['type'] == 3){
$news = new News($val);
//TODO $news
}
}
}
}
I know that is variant is wrong, better to put all array posts() to class. But I can not do this.
I need, that for different type of element of array - to work separate class (for news - News class, article - class Article etc.)
What do you advise me?
From the minimal info provided.. I assume you are looking for something like this:
<?php
class Init {
public static function define($type, $text)
{
switch($type) {
case 1:
return new Articles($text);
break;
case 2:
return new News($text);
break;
default:
throw new Exception('Undefined type');
}
}
}
// $template = Init::define(1, 'article text');
// $template = Init::define(2, 'news text');

Categories