php Posted May 3, 2018 Share Posted May 3, 2018 Hello, I've been using PHP in an amateurish way for a little while, never really gotten my head around classes etc, but I wrote one for a basic site. I want to make several instances of a site, and link them all to the same Processwire install. So I'm loading Processwire like so in index.php: require('/home/centralsite/public_html/wire/core/ProcessWire.php'); $site = new \ProcessWire\ProcessWire('/home/centralsite/public_html/site/', 'http://example.com'); Works fine Then I'm loading my class include "submissions.class.php"; $submissions = new Submissions; My class does a variety of things <?php class Submissions { private function fields($id=1015) { // load some cms fields } function insert($data) { // foobar } function validate($value,$type) { // foobar } } These functions (redacted) all work fine but... now lets say I want to use some fields etc from my Processwire install inside my class, how do I do it? Eg, if inside $submissions->insert(), I want to get something from $site->pages() or similar. I tried putting it as a method at the top of my class, and then loading it with $this->connect(); however, if I try to do that more than once, I get errors for redefining a class. So, I think I need to extend the Processwire class somehow? Link to comment Share on other sites More sharing options...
qtguru Posted May 3, 2018 Share Posted May 3, 2018 So the reason for uses Classes, is that you want to hide complexity and just expose the method in a clean manner, and also you want to deal with properties internally without side effects as you would when doing procedural type of coding. So if you want to pass any data to your classes, there are multiple ways but the best way is to always pass the data by copy in either constructor like this <?php class Submisssion{ private data; __construct(data){ $this->data=data } } or using a Setter method <?php class Submission { private data; public function insert($data){ $this->data = $data; } $submission->insert($data); What this does is pass the data through a method and achieves the same as the constructor, because this way the Submission class can handle manipulation of data without external change outside the class. Which is why OOP is usually preferred as alot of things are hidden and the methods are made simple so you can use a Class without having to read the internal details. 1 Link to comment Share on other sites More sharing options...
horst Posted May 3, 2018 Share Posted May 3, 2018 something like this should work: <?php class Submissions { protected $site = null; // <= add a handle for the site public function __construct($site) { $this->site = $site; // <= assign the site to the class handle } function insert($data) { $this->site->pages->find(....); // <= use the site through the class handle } } <?php require('/home/centralsite/public_html/wire/core/ProcessWire.php'); $site = new \ProcessWire\ProcessWire('/home/centralsite/public_html/site/', 'http://example.com'); include "submissions.class.php"; $submissions = new Submissions($site); // <= here you pass your pw instance ($site) into your class 2 Link to comment Share on other sites More sharing options...
php Posted May 3, 2018 Author Share Posted May 3, 2018 Thank you both, this is exactly what I needed. @Sephiroth is your code PHP 7? My IDE didn't like it, but the method worked. I have learned something useful! 1 Link to comment Share on other sites More sharing options...
Sergio Posted May 3, 2018 Share Posted May 3, 2018 Hi @php ! I'd like to recommend to you a free PHP course by Jeffrey Way, the guy behind Laracasts: https://laracasts.com/series/php-for-beginners I think you're going to love it. 2 Link to comment Share on other sites More sharing options...
qtguru Posted May 3, 2018 Share Posted May 3, 2018 3 hours ago, php said: Thank you both, this is exactly what I needed. @Sephiroth is your code PHP 7? My IDE didn't like it, but the method worked. I have learned something useful! Lol I write Java in the office so i make the mistake of fusing Java into PHP. Link to comment Share on other sites More sharing options...
qtguru Posted May 3, 2018 Share Posted May 3, 2018 4 hours ago, horst said: something like this should work: <?php class Submissions { protected $site = null; // <= add a handle for the site public function __construct($site) { $this->site = $site; // <= assign the site to the class handle } function insert($data) { $this->site->pages->find(....); // <= use the site through the class handle } } function insert($data) { $this->site->pages->find(....); // <= use the site through the class handle } The problem i find with this, is that now your class knows too much about the site pages, it would be better to simply pass the data, else this would lead to tight coupling, unless you have to create an interface and ensure the contracts are followed. Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now