SOAP es un protocolo de intercambio de datos entre diferentes procesos basado en XML. Una definición bastante completa la podéis encontrar en 
wikipedia. Una vez dicho esto vamos a empezar a ver cómo creamos un web service básico en PHP y que use dicho protocolo.
Lo primero que necesitaremos será descargar 
NuSOAP a nuestro proyecto. Se trata de un pequeño toolkit que nos facilitará la vida con varias clases para trabajar con este protocolo en PHP. Una vez descargado y descomprimido dentro de una carpeta de nuestro proyecto, simplemente la deberemos incluir en el archivo PHP que va a funcionar de web service.
A continuación veremos un ejemplo básico. A nuestro fichero le llamaremos test.php y lo que hará será recibir dos números enteros, multiplicarlos y devolver el resultado.
require_once("nusoap.php"); 
$server = new soap_server();
$server->register('multiplicarNumeros'); 
function multiplicarNumeros($valor1, $valor2){ 
 $res = $valor1 * $valor2; 
 return $res; 
} 
$server->service($HTTP_RAW_POST_DATA);
 
A continuación nos hará falta un cliente del web service al que llamaremos cliente.php. Lo que haremos será en el constructor llamar a la url del servidor y mediante la función call() llamar al método que nos multiplicarla los números. Los parámetros de la función los pasaremos en forma de array. 
require_once("nusoap.php"); 
$cliente = new nusoap_client("http://localhost/test.php");
$error = $cliente->getError(); 
if ($error){ 
 echo "Error: $error"; 
} 
$res = $cliente->call("multiplicarNumeros", array("valor1" => "10", "valor2" => "15")); 
$error = $cliente->getError(); 
if ($error){ 
 echo "Error: $error"; 
} else { 
 echo "Resultado: $res"; 
}
 
Hasta aquí tendríamos un cliente y servidor básico pero para que sea un web service más correcto nos haría falta definir el 
WSDL en la parte del servidor y así tener una definición de los métodos y parámetros que contiene. Para que NuSoap nos lo genere deberemos cambiar un poco la parte del servidor y nos quedaría de la siguiente forma. 
require_once("nusoap.php"); 
$server = new soap_server(); 
// Configuramos el namespace y el WSDL 
$ns = "test"; 
$server->configureWSDL('test', $ns); 
$server->wsdl->schemaTargetNamespace = $ns; 
// Cambiamos la llamada para añadirle los parámetros de entrada y salida y el namespace 
$server->register('multiplicarNumeros', array('valor1' => 'xsd:integer', 'valor2' => 'xsd:integer'), array('return' => 'xsd:integer'), $ns); 
function multiplicarNumeros($valor1, $valor2){ 
 $res = $valor1 * $valor2; 
 return $res; 
} 
$server->service($HTTP_RAW_POST_DATA);
 
Ahora simplemente debes acceder a tu navegador y llamar a la URL http://localhost/test.php?wsdl y verás el WSDL que se ha generado.