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');
Related
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
I hope someone can help me with my problem. I'm still a beginner in PHP so sorry.
My code looks like this:
class Component
{
public $title;
// value if nothing gets set
public function __construct($title = "Test") {
$this->title = $title;
}
public function setTitle($value)
{
$this->title = $value;
}
public function getTitle()
{
return "Title: ".$this->title;
}
public function returnInfo()
{
$info = array(
'Titel' => $this->title,
);
return $info;
}
So in the class "Component" the functions should set and get a specific value. If nothing is set for a.e. title it should get the value "Test". With returnInfo() the informations like title should get returned.
My other class (where someone can add the informations like title) looks like this:
abstract class ComponentInfo extends Component
{
protected function getComponentInfo ()
{
$button1 = new Component;
$button1->setTitle("Button-Standard");
// should return all infos for button1
$button1Info = $button1->returnInfo();
foreach ($button1Info as $info)
{
echo ($info);
}
}
}
So it should work like this: in a other class named ComponentInfo a user can add a component like a button. Then the user can set informations like the title. And after that the information should get saved in an array and now I want to display all informations like this:
Title: Button-Standard
How can it work? And where is the mistake in my code?
It would be helpful to get a working code where the user can make as much ComponentInfo classes he want and where he can add different components with information that can be saved into an array.
And at the end it should get outputed as text on a main page.
You can't instantiate an abstract class. You need to remove the abstract keyword from the ComponentInfo class.
UPDATE given the info in your comment, I'd go this
Component.php
abstract class Component
{
private $key;
private $title;
public function __construct($key, $title) {
$this->setKey($key);
$this->setTitle($title);
}
public function setKey($key)
{
$this->key = $key;
}
public function getKey()
{
return $this->key;
}
public function setTitle($title)
{
$this->title = $title;
}
public function getTitle()
{
return $this->title;
}
public function __toString()
{
return $this->getKey().': '.$this->getTitle();
}
}
ComponentInfo.php
class ComponentInfo extends Component
{
public function __construct($key='Info', $title='example title')
{
parent::__construct($key, $title);
}
}
And then use it in your code
somefile.php
$components = [];
$components []= new ComponentInfo();
$components []= new ComponentInfo('Different Key', 'Other info');
$components []= new ComponentNavigation('longitude', 'latidude'); //create another class like ComponentInfo
[... later you want to print this info in a list for example]
echo '<ul>';
foreach($components as $components) {
echo '<li>'.$component.'</li>'; //the __toString() method should get called automatically
}
echo '</ul>';
This should work, however, having different components with no other specificities than a different title and key is pointless. Instead, you could simply have different Components with a different key and title.
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";
}
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.
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
It's been a while since I last work with object. I can't figure out what I did wrong. I have a class that contain another class as a property. After instantiating ItemDetail() inside Item(), I can't get the value of description. var_dump($item) give me NULL for the value of $detail. Please help. Thank you.
<?php
class Item
{
private $name;
private $detail;
function __construct() {
$this->name = 'some name';
$this->detail = new ItemDetail();
}
function getDetail() {
return $this->detail;
}
}
class ItemDetail
{
private $description;
function __construct() {
$this->description = 'some description';
}
function getDescription {
return $this->description;
}
}
$item = new Item();
echo $item->getDetail()->getDescription();
//var_dump($item);
?>
You need to change the scope of your class properties, or define a method that returns the values. Example:
class Item
{
private $name;
private $detail;
function __construct() {
$this->name = 'some name';
$this->detail = new ItemDetail();
}
public function getDescription() {
return $this->detail->getDescription();
}
}
class ItemDetail
{
private $description;
function __construct() {
$this->description = 'some description';
}
public function getDescription() {
return $this->description;
}
}
$item = new Item();
echo $item->getDescription();
If you make your properties public, you can get them like this as well:
class Item
{
public $name;
public $detail;
public function __construct() {
$this->name = 'some name';
$this->detail = new ItemDetail();
}
}
class ItemDetail
{
public $description;
public function __construct() {
$this->description = 'some description';
}
}
$item = new Item();
echo $item->detail->description;
It's all about visibility