Java has some issues, I'll give you that. Some problems are inherent...the language is cross-platform compatible...basically you kinda precompile the thing, then distribute it...when a user wants to run it, the final compile runs on their machine, whcih converst it into something useable by their platform. That's how a Java applet works just as well on Solaris, Red Hat, Windows and Mac.
However, the negative effect is every time you run a java applet, you're basically compiling it (sorta) which makes loading times retarded. So you give up quick loading for cross platform compatibility.
Some other issues I've seen with Java are things like memory usage (which is supposed to be handled automatically, AFAIK) and what seems like some crashingness. Having never really programmed in it, though, I can't say whether some of the negatives I've noticed are due just to bad programming. I mean, I've seen some REALLY bad PHP, but that doesn't make PHP bad.
As for C++...let's just say that when I was trying to learn it, I would spend hours/days trying to figure out easy crap. Like using one of the built-in functions (or part of the standard library, whatever) that expects a char input and I'm trying to push in a string... and it took me forever to figure out to just use .tochar() (or something like that, I forget again).
Why? Why not just overload the standard library function to allow string input? It's not hard. I do overloading of methods regularly in c# as just part of my web development...it's really not that hard. But it's little simple crap like that which really annoys me.
Some other stuff... memory allocation. I hate having to specify the size of a memory buffer every time I create a variable. c# still has that problem when it comes to arrays.
Let's say I'm trying to stuff a sql query result set into an array. In php, I would run the query, then read it (probably using foreach() and just push it into the array. Boom, done, very few lines of code.
[php]
<?
$select = 'SELECT one, two three FROM table';
$result = $this->doquery($select);
/*
I usually put the actually query execution in a separate method...
makes switching DBs / DB Types alot easier
*/
foreach($result as $row){ //exact syntax is a bit different, I forget
$array[]['one'] = $row['one'];
$array[]['two'] = $row['two'];
$array[]['three'] = $row['three'];
}
print_r($array);
?>
[/php]
however, in c# you can't do that. I don't have my IDE here, so the following is pseudo-c#
[php]<%
string select = 'SELECT count(*) FROM table'; //get the number of results
doquery(select);
/*
I use oledbdatareader objects to pull the data and store the result set to a class property
*/
dr.Read();
int numrows = Convert.ToInt16(dr.GetValue(0))
string[,] myarray = new array[numrows,3];
select = 'SELECT one, two three FROM table'; //get the actual results
doquery(select);
dr.Read();
for(int i=0; i<numrows; i++){
myarray[i,0] = Convert.ToString(dr.GetValue(0));
myarray[i,1] = Convert.ToString(dr.GetValue(1));
myarray[i,2] = Convert.ToString(dr.GetValue(2));
dr.Read();
}
foreach(string row in myarray){
Response.Write(row[0]) + "<br>";
Response.Write(row[1]) + "<br>";
Response.Write(row[2]) + "<br>";
}
%>[/php]
Now, I may not be doing this as well as I could be, but the point is that c# is significantly more taxing on the programmer than PHP is. PHP automatically figures out the type of the array (and allows mixing of types), which in c# you have to specify it...and woe unto he who tries to stuff the wrong type into the array. PHP also allows you to dynamically size the array as needed...in c# you have to specify it manually. And finally, in PHP you can get a num_rows easily from a query. In c#, you can't get the number of rows returned from an OleDBDataReader object. Though you can get the number of fields returned.
Bleh...anyway, maybe I'm spoiled.