473,387 Members | 1,757 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,387 software developers and data experts.

Is this bad OOP?

Using PHP 4.3.6, so PHP 5 features are not yet available. Will be soon,
though.

I have a method that I want to call in two different ways: statically,
and when an object is instantiated.

I do that like this:

class SomeClass {

var $var = 'something';

function getSomething($var = 0) {

if ($var == 0)
$var = $this->var;

$returnvalue = do_something($var);

return $returnvalue;
}
}

Now I can do this:

$x = SomeClass::getSomething('something');

and this:

$class = new SomeClass();
$x = $class->getSomething();

But I fear that this may be bad OOP style. Or maybe this fear is
unnecessary. Any insights would be appreciated.

Regards,
Jan Pieter Kunst

--
Sorry, <de*****@cauce.org> is een "spam trap".
E-mail adres is <jpk"at"akamail.com>, waarbij "at" = @.
Jul 17 '05 #1
4 1566
Jan Pieter Kunst wrote:
But I fear that this may be bad OOP style. Or maybe this fear is
unnecessary. Any insights would be appreciated.


In general, class methods are only accessed statically when they perform
standalone tasks, without references to class instances ($this) or
properties.

An example would be an Utils class, with a method print(). This method would
accept one argument and prints this. Depending on the application you are
building, you can opt for the creation of a class instance or access the
method statically.

In singleton classes (classes which allow only one instance to be created),
an instance is retrieved often through a static method and further
operations are performed through this instance:

$instance =& Singleton::getInstance();
$instance->someMethod();

(the ampersand means that a reference to the class instance is assigned to
the variable; not needed when you have switched over to PHP5)

BTW, the class in your example would not work, because without class
instantiation, only class methods and variables within these methods exist.

You would have to create an instance before you are able to access class
properties:

class SomeClass {
var $var = 'something';

function getSomething($var = 0) {
if ($var === 0) {
if (!isset($this)) $this = new SomeClass;
$var = $this->var;
}

$returnvalue = do_something($var);
return $var;
}
}
See also: http://www.php.net/manual/en/keyword...ekudotayim.php
JW

Jul 17 '05 #2
If you want to have a singleton object the simplest, though not
elegant, way of doing it is to have a function which returns a static
variable for that object. The problem with this approach is that you
have a separate function for each class that you want to have Singleton
status:
function & getMyDatabaseConnectorClass() {
// see if the class already exists.
if (is_object($myDatabaseConnector) {
return $myDatabaseConnector;
} else {
// otherwise create it
static $myDatabaseConnector = new MySqlDatabaseConnector();
return $myDatabaseConnector;
}
}

Jul 17 '05 #3
.oO(lk******@geocities.com)
If you want to have a singleton object the simplest, though not
elegant, way of doing it is to have a function which returns a static
variable for that object.
It's better to write a getInstance() method for the classes that should
work as a singleton, e.g. (PHP5)

class Foo {
private static $instance;

public static function getInstance() {
if (!isset(self::$instance)) {
self::$instance = new Foo();
}
return self::$instance;
}
}
function & getMyDatabaseConnectorClass() {
// see if the class already exists.
if (is_object($myDatabaseConnector) {


Besides the parse error the above line will generate a notice on first
call.

Micha
Jul 17 '05 #4
"Jan Pieter Kunst" <de*****@cauce.org> wrote in message
news:41***********************@news.xs4all.nl...
Using PHP 4.3.6, so PHP 5 features are not yet available. Will be soon,
though.

I have a method that I want to call in two different ways: statically,
and when an object is instantiated.

I do that like this:

class SomeClass {

var $var = 'something';

function getSomething($var = 0) {

if ($var == 0)
$var = $this->var;

$returnvalue = do_something($var);

return $returnvalue;
}
}

Now I can do this:

$x = SomeClass::getSomething('something');

and this:

$class = new SomeClass();
$x = $class->getSomething();

But I fear that this may be bad OOP style. Or maybe this fear is
unnecessary. Any insights would be appreciated.


I won't comment on style. I will just point out a idiosyncrancy in PHP that
makes this practice potentially problematic.

When you call a static class method from within a object method, the static
method will have access to the $this variable from which the call originate.
Easy to show in code than in prose:

<?

class A {
var $cow = "Cow A";
function Run() { B::Walk(); }
}

class B {
var $cow = "Cow B";
function Walk() { echo $this->cow; }
}

$A = new A();
$A->Run();

?>

The snippet above will print "Cow A," because B::Walk() receives a copy of
$this from A::Run().

This quirk isn't a big issue when static methods are, well, static methods,
since you wouldn't be accessing $this anyway. When a static method is
sometimes not a static method then things will start to get real hairy.
Jul 17 '05 #5

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

3
by: William C. White | last post by:
Does anyone know of a way to use PHP /w Authorize.net AIM without using cURL? Our website is hosted on a shared drive and the webhost company doesn't installed additional software (such as cURL)...
2
by: Albert Ahtenberg | last post by:
Hello, I don't know if it is only me but I was sure that header("Location:url") redirects the browser instantly to URL, or at least stops the execution of the code. But appearantely it continues...
3
by: James | last post by:
Hi, I have a form with 2 fields. 'A' 'B' The user completes one of the fields and the form is submitted. On the results page I want to run a query, but this will change subject to which...
0
by: Ollivier Robert | last post by:
Hello, I'm trying to link PHP with Oracle 9.2.0/OCI8 with gcc 3.2.3 on a Solaris9 system. The link succeeds but everytime I try to run php, I get a SEGV from inside the libcnltsh.so library. ...
1
by: Richard Galli | last post by:
I want viewers to compare state laws on a single subject. Imagine a three-column table with a drop-down box on the top. A viewer selects a state from the list, and that state's text fills the...
4
by: Albert Ahtenberg | last post by:
Hello, I have two questions. 1. When the user presses the back button and returns to a form he filled the form is reseted. How do I leave there the values he inserted? 2. When the...
1
by: inderjit S Gabrie | last post by:
Hi all Here is the scenerio ...is it possibly to do this... i am getting valid course dates output on to a web which i have designed ....all is okay so far , look at the following web url ...
2
by: Jack | last post by:
Hi All, What is the PHP equivilent of Oracle bind variables in a SQL statement, e.g. select x from y where z=:parameter Which in asp/jsp would be followed by some statements to bind a value...
3
by: Sandwick | last post by:
I am trying to change the size of a drawing so they are all 3x3. the script below is what i was trying to use to cut it in half ... I get errors. I can display the normal picture but not the...
0
by: taylorcarr | last post by:
A Canon printer is a smart device known for being advanced, efficient, and reliable. It is designed for home, office, and hybrid workspace use and can also be used for a variety of purposes. However,...
0
by: ryjfgjl | last post by:
If we have dozens or hundreds of excel to import into the database, if we use the excel import function provided by database editors such as navicat, it will be extremely tedious and time-consuming...
0
by: ryjfgjl | last post by:
In our work, we often receive Excel tables with data in the same format. If we want to analyze these data, it can be difficult to analyze them because the data is spread across multiple Excel files...
0
BarryA
by: BarryA | last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
1
by: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
0
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...
0
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers,...
0
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.